【发布时间】:2021-03-03 20:32:07
【问题描述】:
考虑以下代码:
private static BackgroundWorker bg = new BackgroundWorker();
static void Main(string[] args) {
bg.DoWork += bg_DoWork;
bg.ProgressChanged += bg_ProgressChanged;
bg.WorkerReportsProgress = true;
bg.RunWorkerAsync();
Thread.Sleep(10000);
}
static void bg_ProgressChanged(object sender, ProgressChangedEventArgs e) {
Console.WriteLine(e.ProgressPercentage);
Thread.Sleep(100);
Console.WriteLine(e.ProgressPercentage);
}
static void bg_DoWork(object sender, DoWorkEventArgs e) {
for (int i = 0; i < 10; i++) {
bg.ReportProgress(i);
}
}
运行时我得到以下输出:
0 1 1 2 0 3 2 3 5 4 4 6 5 7 7 8 6 9 8 9
我了解问题是 BackgroundWorker 为每次调用 ReportProgress 启动的线程之间的竞争条件。
如何确保每个 bg_ProgressChanged 的整个主体都按照我调用它们的顺序执行? 那就是我想得到 p>
0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
结果。
【问题讨论】:
-
BackgroundWorker 并不是真的要在没有 UI 线程的情况下使用。
-
在增量中优先使用 ReportProgress 的 Ist 参数,而不是 userState 参数。建议您查看此 MSDN 链接以报告进度:msdn.microsoft.com/en-us/library/a3zbdb1t.aspx
-
@Vijay 谢谢。修好了。
-
尝试将 ReportProgress 方法调用包装在 lock(_objectLock) 块中,例如lock(_lockObject) { bg.ReportProgress(i); }
-
@Vijay:这根本不会有任何区别;这些调用在同一个线程上运行。
标签: c# .net backgroundworker race-condition