我有一个简单的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();
}
从主UI线程上的WPF按钮处理程序调用SomeMethod。
通常情况下这很好用,但我经常会得到一个报告,说明操作失败了(根据在LongyOperation中生成的日志),即布尔结果在完成处理程序中记录为false操作应该在DoWork处理程序中返回true。
我仔细检查并测试了LongyOperation中的代码,以确保我内部没有一些微妙的错误,我相信它很干净。我无法在我的开发环境中重现它。
我在设置和读取结果值方面是否存在竞争条件?我希望在完成事件被触发之前,在DoWork中完成赋值操作。
答案 0 :(得分:0)
看起来我应该没问题,假设BackgroundWorker
基础设施确保存在适当的内存障碍。
你确定你不只是有两个并发操作,并且你同时看到两组日志吗?