【问题标题】:backgroundWorker.ProgressChanged event fires too fastbackgroundWorker.ProgressChanged 事件触发太快
【发布时间】:2014-01-16 19:18:55
【问题描述】:

我有办法:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
     if (!backgroundWorker1.CancellationPending)
     {
         Ctransakcja obj = (Ctransakcja)e.UserState;
         string[] row = new string[] { obj.id.ToString(), obj.tytul, obj.kwota, obj.nrkonta,obj.bank };
         dataGridView2.Rows.Add(row); 
     }
}

此方法将行添加到 datagridview。 在后台工作者的 dowork 事件中,我调用方法 LoadData 连接到数据库并触发 ReportProgress 事件。

加载数据:

...
while (reader.Read())
{
   obj.id = int.Parse(reader[0].ToString());
   obj.tytul = reader[1].ToString();
   obj.kwota = reader[2].ToString();
   obj.nrkonta = reader[3].ToString();
   obj.bank = reader[4].ToString();
   //dodanie danych itd
   backgroundWorker1.ReportProgress(i, obj);
   i++;
  // Thread.Sleep(100);
}
...

一切都适用于Thread.Sleep(100),但在 datagridview 中没有睡眠日期是混合和复制的。我需要一些 WAIT 函数来检查是否添加了行并从数据库中调用下一行的下一个报告进度。

谢谢

【问题讨论】:

  • @CamBruce 因为那样你才能看到第一个结果,直到最后一个结果到达,而不是能够看到输入的结果流(并且可以呈现)
  • @CamBruce 我知道这是最好的解决方案,但我想在这种情况下如何解决它:)
  • @Servy 你有什么办法解决我的问题吗????

标签: c# datagridview backgroundworker


【解决方案1】:

ReportProgress 事件确实不应该用于绑定您的数据。它更多地用于更新带有进度的 UI 控件。在后台线程中绑定你的数据,使用Invoke()

while (reader.Read())
{
   obj.id = int.Parse(reader[0].ToString());
   obj.tytul = reader[1].ToString();
   obj.kwota = reader[2].ToString();
   obj.nrkonta = reader[3].ToString();
   obj.bank = reader[4].ToString();
   //dodanie danych itd


   dataGridView2.Invoke((MethodInvoker) delegate { dataGridView2.Rows.Add(obj);});

}

【讨论】:

  • 检查InvokeRequired 没有意义。你知道你在后台线程中,所以你知道你需要调用。
  • 是的 - 旧习惯很难改掉,只是习惯了这样写。将更新帖子。
  • 就我个人而言,我还没有找到一个值得使用InvokeRequired 的时间。您应该始终知道给定的代码块应该从 UI 线程或非 UI 线程运行。将自己置于不知道某些代码是从 UI 还是非 UI 线程运行的位置是一个可怕的位置,应该不惜一切代价避免。
  • 同意。不想在那种情况下:)
  • Invoke() 在这种情况下无关紧要,因为它可以工作,但是报告进度是在没有任何同步的情况下进行调整的,因此这会在 gridview 中显示混合数据
猜你喜欢
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
相关资源
最近更新 更多