WP7 为两个 BackgroundWorker 对象触发一个 RunWorkerCompleted 事件

Posted

技术标签:

【中文标题】WP7 为两个 BackgroundWorker 对象触发一个 RunWorkerCompleted 事件【英文标题】:WP7 One RunWorkerCompleted event firing for two BackgroundWorker objects 【发布时间】:2011-06-28 17:35:29 【问题描述】:

我有一些继承自 BaseOperation 类的对象。其中包括 IntializeOperation、SignOnOperation、SignOffOperation 等。

BaseOperation 类有一个 Execute() 方法,该方法使用 BackgroundWorker 来执行任务,包括进行服务调用。我意识到这可能不是最好的设计,但这是我现在正在使用的,现在重新设计是不可行的。这是该类的简化版本。

public void AsyncExecute()

    _result = DoOperation();


public void Execute()

    _worker = new BackgroundWorker();
    _worker.WorkerReportsProgress = false;

    _worker.DoWork += (s, e) =>
    
        AsyncExecute();
    ;

    _worker.RunWorkerCompleted += (s, e) =>
    
        //Tell our callback what we've done
        if (_result is Exception)
            Failed(_result as Exception);
        else
            Succeeded(_result);
    ;

    _worker.RunWorkerAsync();

如果我调用一项操作,它就可以正常工作。但是,如果我快速连续调用两个操作,我会遇到问题。

当第一个操作完成时,它会调用 RunWorkerCompleted 两次,每次操作一次。我知道,因为我可以在 RunWorkerCompleted 委托中设置断点,它会被命中两次,而且我还可以检查我要执行的操作,以确认每次调用它时它处于不同的操作中。我可以在第二个操作的 DoOperation() 方法中设置断点,以确认即使在该操作触发了 RunWorkerCompleted 事件之后它仍继续运行。

当只有第一个操作完成时,我无法弄清楚为什么两个操作都会引发 RunWorkerCompleted 事件。

【问题讨论】:

您为“执行”使用了错误的名称。它应该是“BeginExecute”。 这是为什么呢?代码正常工作。我认为它叫什么并不重要。我像 SignOffOperation.Execute() 一样使用它。 【参考方案1】:

我发现了问题所在。我在 DoOperation() 方法中使用 ManualResetEvent。如果两个操作同时进行,则认为一切都已完成。

【讨论】:

以上是关于WP7 为两个 BackgroundWorker 对象触发一个 RunWorkerCompleted 事件的主要内容,如果未能解决你的问题,请参考以下文章

C#timer backgroundworker用户控件

使用队列在两个 BackgroundWorker 之间传递数据

怎么在backgroundWorker执行时传递数据

两个同时运行的线程控件(BackgroundWorker)串数据

WP7 应用程序在部署后立即崩溃

将 'BackgroundWorker' 替换为 'Thread'