![](/img/trans.png)
[英]BackgroundWorker.ProgressChanged event not on Dispatcher Thread
[英]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.