【发布时间】:2015-08-07 23:53:48
【问题描述】:
我想在检索数据的同时逐步更新我的 gridview
我有一个后台工作者做如下工作功能
private void backGroundWrkr_DoWork(object sender, DoWorkEventArgs e)
{
DataTable dtInstant = new DataTable();
for (int i = 0; i < allFiles.Count; i++)
{
if (backGroundWrkr.CancellationPending)
{
e.Cancel = true;
return;
}
myApp.processFile(allFiles[i]);
this.Invoke((MethodInvoker)delegate
{
myGrdVw.DataSource = myApp.dtResults;
});
backGroundWrkr.ReportProgress(100 * (i + 1) / allFiles.Count);
}
backGroundWrkr.ReportProgress(100);
}
这是我的报告进度功能
private void backGroundWrkr_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
这是我的后台GroundWrkr完成
private void backGroundWrkr_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar.Visible = false;
allFiles.Clear();
}
我也尝试过 BeginInvoke 而不是 Invoke,但我的 gridview 仍然冻结! 我处理文件的逻辑没有问题,因为如果我将 datagridview 绑定放在 workercomplete 中,它会成功绑定
【问题讨论】:
-
冻结可能是因为后台工作人员太快了?你能在里面放一个睡眠定时器吗?
-
我需要睡觉吗?会不会影响性能?
-
我在调用之前尝试过 Thread.Sleep(1000) 并且没有发生相同的冻结但在某种程度上进程缓慢
-
为什么不把这条指令“myGrdVw.DataSource = myApp.dtResults”放在backGroundWrkr_ProgressChanged中?
-
我得到了同样的结果!!
标签: c# gridview delegates backgroundworker desktop-application