进度条没有进展(progress bar not progressing)

2019-08-01 01:31发布

我有一个计划,在SQLSERVER更新表,我有我想表明这一点,进度条递增进度形式,但这种不被显示。 我是否需要使用后台工作的呢? 什么IM的例子做

public void updateTable(string tableName)
{
  // con is an instance of my form to access progressbar
  con.progressBar1.Minimum = 1;
  con.progressBar1.Step = 1;
  string dbQuery = "select summet from someting"

  con.progressBar1.Maximum = address.Tables[0].Rows.Count;
  MessageBox.Show("progress bar max " + con.progressBar1.Maximum);

   foreach (DataRow LonLat in address.Tables[0].Rows)
   {
       con.progressBar1.PerformStep();
       MessageBox.Show(con.progressBar1.Value.ToString()); // this is incrementing
       //plus updating table 

   }


}

Answer 1:

简短的回答 ,是的。 如果从主线程做它,你将不会看到进度条更新。

长一点的回答:

当你从一块代码的经过翻译成“信息”到窗口消息队列中,将得到该消息,并在主线程中更新相应的UI修改用户界面。

然而,由于主线程正忙于处理您的代码块它没有“时间”实际更新用户界面,只有当你的程序完成,它是免费的,更新的用户界面。 这就是为什么你看到进度条从0%增加至100%,没有任何中间步骤。

你应该做的:

你想做的事就是把工作变成后台工作,这样,主线程是免费参加UI更新请求......这,顺便说一句,如果你想一个标准的做法保持UI响应。



Answer 2:

是的,你应该使用后台工作,但它可能没有帮助,我们需要看到的绑定和其他事物一样,使用背景工人使用的是这样的:

Window.Dispatcher.BeginInvoke((Action)(() =>
        {
            con.progressBar1.PerformStep();
        }


Answer 3:

是的,你必须使用后台工作

BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += (o, ea) =>
    {
     // your code goes here
       }
 worker.RunWorkerCompleted += (q, ea) =>
    {
      }
 worker.RunWorkerAsync();


Answer 4:

出现这种情况,如果我们不能用一个BackgroundWorker。 我有一个进度条,其唯一的工作就是接受PerformStep的命令,从打开它的一些其他形式的一种形式,而形式必须简单地做到这一点。 这两种形式都在GUI线程。 不过,我没有得到来自进度一致的行为。 在进度条下面的代码始终是一步比它的Value属性意味着背后:

public partial class Form1 : Form
   {
      private readonly int m_numOfSteps;

      public Form1(int numOfSteps)
      {
         m_numOfSteps = numOfSteps;
         InitializeComponent();
      }

      private void Form1_Load( object sender, EventArgs e )
      {
         progressBar1.Step = (int)Math.Ceiling( 100.0 / m_numOfSteps );
      }

      public void DoStep(string msg)
      {
         progressBar1.PerformStep();
         label1.Text = msg;
         label2.Text = String.Format( "{0}%", progressBar1.Value  );
         label1.Refresh();
         label2.Refresh();
      }
   }

   public partial class Form2 : Form
   {
      public Form2()
      {
         InitializeComponent();
      }

      private void button1_Click( object sender, EventArgs e )
      {
         using( Form1 f = new Form1( 3 ) )
         {
            f.Show();
            f.Refresh();
            Thread.Sleep( 1000 );
            f.DoStep( "AAAA" );
            Thread.Sleep( 1000 );
            f.DoStep( "BBBB" );
            Thread.Sleep( 1000 );
            f.DoStep( "CCCC" );
            Thread.Sleep( 1000 );
         }
      }
   }


文章来源: progress bar not progressing