C# 闭包和BackgroundWorker事件处理程序

C# 闭包和BackgroundWorker事件处理程序,c#,.net-3.5,closures,backgroundworker,C#,.net 3.5,Closures,Backgroundworker,我定义了一个简单的BackgroundWorker,它对DoWork和RunWorkerCompleted事件处理程序使用闭包,分别设置和检查布尔值。简化后的代码(C#在.NET 3.5中)如下所示: public void SomeMethod() { BackgroundWorker worker = new BackgroundWorker(); bool result = false; worker.DoWork +

我定义了一个简单的BackgroundWorker,它对DoWork和RunWorkerCompleted事件处理程序使用闭包,分别设置和检查布尔值。简化后的代码(C#在.NET 3.5中)如下所示:

    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内部生成的日志),即当操作在DoWork处理程序中应返回true时,布尔结果在已完成的处理程序中记录为false

我仔细检查并测试了LengthyOperation内部的代码,以确保其中没有任何细微的错误,我相当确信它是干净的。我无法在我的开发环境中复制它


我在设置和读取结果值的方式中是否有竞争条件?我希望分配操作在触发completed事件之前已经在DoWork中完成。

看起来应该可以,假设
BackgroundWorker
基础结构确保存在适当的内存障碍


您确定不只是有两个并发操作,而且同时看到两组日志吗?

在简化示例时,我省略了禁用按钮的部分,以便在操作完成之前无法再次触发操作。日志与此一致。我有一个将其转换为.NET4的辅助项目,我可能会出于学习体验的原因将后台工作人员转换为任务。谢谢你的精神检查。