Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WP7两个BackgroundWorker对象的一个RunWorkerCompleted事件触发_C#_Multithreading_Silverlight_Windows Phone 7_Backgroundworker - Fatal编程技术网

C# WP7两个BackgroundWorker对象的一个RunWorkerCompleted事件触发

C# WP7两个BackgroundWorker对象的一个RunWorkerCompleted事件触发,c#,multithreading,silverlight,windows-phone-7,backgroundworker,C#,Multithreading,Silverlight,Windows Phone 7,Backgroundworker,我有几个从BaseOperation类继承的对象。这些包括初始化操作、SignOnOperation、SignOffOperation等 BaseOperation类有一个Execute()方法,该方法使用BackgroundWorker执行任务,包括进行服务调用。我意识到这可能不是最好的设计,但这正是我目前正在使用的,重新设计目前不可行。下面是这个类的简化版本 public void AsyncExecute() { _result = DoOperation(); } public

我有几个从BaseOperation类继承的对象。这些包括初始化操作、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事件。

我解决了这个问题。我在DoOperation()方法中使用ManualResetEvent。如果两个操作同时进行,它会认为所有操作都已完成。

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