我需要生成 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()
在循环内部,进度条仅在循环完成时更改其值。
为什么会发生这种情况,我该如何解决?
最佳答案
Invoke... 这就是你弄错的地方。您只是创建了一个后台工作程序,以便将代码调用回主线程(这就是 Invoke 所做的)。
实际上,您应该只对控件访问使用调用,或者只在 ReportProgress 处理程序中修改控件,然后确保每次需要时都调用 ReportProgress 方法。
编辑:澄清:调用的问题是您正在为后台工作人员应该执行的整个工作负载调用 UI 线程。
关于c# - 在不阻塞主线程的情况下运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32160661/