使用 this.invoke(MethodInvoker)delegate 时,我的 Gridview 仍然在 backgroundworker Dowork 中冻结
my Gridview still freezes in backgroundworker Dowork while using this.invoke(MethodInvoker)delegate
我想在检索数据的同时逐渐更新我的 gridview
我有一个backgroundworker做工作函数如下
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;
}
这是我完成的 backGroundWrkr
private void backGroundWrkr_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar.Visible = false;
allFiles.Clear();
}
我也尝试过使用 BeginInvoke 而不是 Invoke,但我的 gridview 仍然冻结!
我处理文件的逻辑没有问题,因为如果我将 datagridview 绑定放在 workercomplete 中,它会成功绑定
尝试仅绑定一次数据源(即在调用 DoWork 之前)并在 backGroundWrkr_ProgressChanged.
中执行 myGrdVw.Invalidate()
经过2天的搜索和不成功的试验我已经解决了它如下
绑定时,后台工作人员似乎正在数据表中工作,所以我绑定了结果数据表的副本,它解决了我的问题
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.copy();
});
backGroundWrkr.ReportProgress(100 * (i + 1) / allFiles.Count);
}
backGroundWrkr.ReportProgress(100);
}
感谢大家的帮助!
我想在检索数据的同时逐渐更新我的 gridview
我有一个backgroundworker做工作函数如下
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;
}
这是我完成的 backGroundWrkr
private void backGroundWrkr_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar.Visible = false;
allFiles.Clear();
}
我也尝试过使用 BeginInvoke 而不是 Invoke,但我的 gridview 仍然冻结! 我处理文件的逻辑没有问题,因为如果我将 datagridview 绑定放在 workercomplete 中,它会成功绑定
尝试仅绑定一次数据源(即在调用 DoWork 之前)并在 backGroundWrkr_ProgressChanged.
中执行 myGrdVw.Invalidate()经过2天的搜索和不成功的试验我已经解决了它如下 绑定时,后台工作人员似乎正在数据表中工作,所以我绑定了结果数据表的副本,它解决了我的问题
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.copy();
});
backGroundWrkr.ReportProgress(100 * (i + 1) / allFiles.Count);
}
backGroundWrkr.ReportProgress(100);
}
感谢大家的帮助!