【发布时间】:2015-08-22 20:51:28
【问题描述】:
我需要生成 n 个随机字符串,这个过程可能需要一段时间并阻塞主线程 UI。为了避免这种情况并让用户在进程运行时使用程序,我决定使用backGroundWorker。但它没有很好地工作,主线程仍然被阻塞。在我的DoWork 活动中,我有这样的事情:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// using Invoke because I change value of some controls, e.g, ListView, labels and a progressbar
this.Invoke((Action)delegate
{
for (int i = 0; i < nSteps; ++i)
{
string s = getnStr();
// ...
int progress = (int)(100.0 / nSteps * (i + 1));
backgroundWorker1.ReportProgress(progress);
}
});
}
即使我在循环内调用ReportProgress(),进度条也只会在循环完成时改变它的值。
为什么会发生这种情况,我该如何解决?
【问题讨论】:
-
如果在 Progress 事件处理程序中发生更新,则不需要 Invoke。
-
我也在循环内更换标签。
-
您也可以使用 ReportProgress 更改标签,提示:它有 UserData
标签: c# .net multithreading backgroundworker