【发布时间】:2011-09-15 21:21:19
【问题描述】:
我定义了一个简单的 BackgroundWorker,它为其 DoWork 和 RunWorkerCompleted 事件处理程序使用闭包,它们分别设置和检查布尔值。简化后的代码(.NET 3.5 中的 C#)如下所示:
public void SomeMethod()
{
BackgroundWorker worker = new BackgroundWorker();
bool result = false;
worker.DoWork += new DoWorkEventHandler(
(sender, e) =>
{
result = LengthyOperation();
});
worker.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(
(sender, e) =>
{
AppendRunLog("Result: " + (result ? "PASS" : "FAIL"));
});
worker.RunWorkerAsync();
}
SomeMethod 从主 UI 线程上的 WPF 按钮处理程序调用。
通常这工作得很好,但每隔一段时间我就会收到一个报告,指出操作在应该通过时失败(根据 LengthyOperation 内部生成的日志),即布尔结果在 Completed 处理程序中记录为 false 时操作应该在 DoWork 处理程序中返回 true。
我仔细检查并测试了 LongyOperation 中的代码,以确保其中没有一些细微的错误,并且我相当确信它是干净的。我无法在我的开发环境中重现它。
在设置和读取结果值的方式上是否存在竞争条件?我希望在触发 Completed 事件之前,DoWork 中的赋值操作已经完成。
【问题讨论】:
标签: c# .net-3.5 closures backgroundworker