0

我有一个程序正在更新 sqlserver 中的表,我有一个表单,我想显示这个进度,进度条正在增加,但没有显示。我需要为此使用后台工作人员吗?我在做什么的例子

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 

   }


}
4

4 回答 4

2

简短的回答,是的。如果您从主线程执行此操作,您将看不到进度条更新。

长答案:

每当您从一段代码修改用户界面时,该代码已转换为“消息”到窗口消息队列中,窗口消息队列将获取该消息并在主线程中相应地更新 UI。

但是,由于主线程忙于处理您的代码,它没有“时间”来实际更新用户界面,只有当您的过程完成时,才可以自由地更新用户界面。这就是为什么您看到进度条从 0% 变为 100% 而没有任何中间步骤的原因。

你应该做什么:

您想做的是将工作放入后台工作人员中,这样主线程就可以自由地处理 UI 更新请求……顺便说一下,如果您想保持 UI 响应,这是一种标准做法。

于 2012-10-01T15:41:56.470 回答
0

是的,您应该使用 Background Worker,但它可能无济于事,我们需要查看绑定和其他所有内容,要使用后台工作程序,请使用以下内容:

Window.Dispatcher.BeginInvoke((Action)(() =>
        {
            con.progressBar1.PerformStep();
        }
于 2012-10-01T15:43:28.987 回答
0

是的,您必须使用后台工作人员

BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += (o, ea) =>
    {
     // your code goes here
       }
 worker.RunWorkerCompleted += (q, ea) =>
    {
      }
 worker.RunWorkerAsync();
于 2012-10-01T15:46:45.497 回答
0

如果我们不能使用 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 );
         }
      }
   }
于 2013-02-08T07:55:12.867 回答