繁体   English   中英

backgroundWorker.ProgressChanged事件触发得太快

[英]backgroundWorker.ProgressChanged event fires too fast

我有方法:

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。 在backgroundworker的dowork事件中,我调用了方法LoadData,该方法连接到数据库并触发ReportProgress事件。

LoadData:

...
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函数来检查是否添加了行,并从数据库的下一行调用下一个报告进度。

谢谢

实际上,不应将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);});

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM