闭包和BackgroundWorker事件处理程序

时间:2011-09-15 21:21:20

标签: c# .net-3.5 closures backgroundworker

我有一个简单的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中完成赋值操作。

1 个答案:

答案 0 :(得分:0)

看起来我应该没问题,假设BackgroundWorker基础设施确保存在适当的内存障碍。

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