BackgroundWorker返回值?

时间:2011-03-07 19:31:26

标签: c# backgroundworker

以下代码将数字从1添加到100并返回总和。我要做的是在后台工作程序中运行计算并返回一个值。这样做的问题是在DoWork完成之前返回returnValue。在返回值之前,如何让它等待后台工作者完成? (我似乎无法将回报放在我的DoWork中......)

double returnValue = 0;

var b = new BackgroundWorker();
b.DoWork += new DoWorkEventHandler(
    delegate(object sender, DoWorkEventArgs e) {
        for(int i=0;i<100;i++){
            returnValue += (i+1);
        }
    }
);

b.RunWorkerAsync();
return returnValue;

附录:在同一个线程上发送消息泵而不是在后台工作者上运行它会更好吗?

此外,这只是示例代码,我的实际代码需要一分多钟才能完成。

5 个答案:

答案 0 :(得分:3)

订阅RunWorkerCompleted活动。该事件包含后台操作的返回值。

当然,该值将从DoWorkEventHandler内部返回,如下所示:

b.DoWork += new DoWorkEventHandler(
    delegate(object sender, DoWorkEventArgs e) {
        double returnValue = 0;
        for(int i=0;i<100;i++){
            returnValue += (i+1);
        }
        return returnValue;
    }
);

答案 1 :(得分:0)

我在这里看不到任何问题,但我认为您正在寻找的是名为RunWorkerCompleted的事件。当DoWork委托完成时会引发这种情况。如果这不是你想要的,我想你需要改写你的问题。

答案 2 :(得分:0)

我已经提出了一个样本:here 也许它可以帮助你: - )

  

此外,这只是示例代码,我的实际代码需要一分多钟才能完成。

这可能是异步启动的影响。您可以告诉后台工作人员何时开始或只是说开始。如果你没有明确说他现在就应该开始,那么当c#认为这是一个开始的好时机时他会开始: - )

答案 3 :(得分:0)

如果像我一样,由于DoWorkEventHandler返回void而导致您无法使用接受的答案,那么下面的代码可能会有所帮助。

double returnValue = 0;
var b = new BackgroundWorker();
b.DoWork += PerformJob;
b.RunWorkerCompleted += JobDone;

private void PerformJob(object sender, DoWorkEventArgs args)
{
    // Pre-Processing: for-loop to increment returnValue
    /*
    ** DoWorkEventArgs has a 'Result' object with the following description
    ** Summary: Gets or sets a value that represents the result of an asynchronous operation.
    ** Returns: An System.Object representing the result of an asynchronous operation.
    */
    args.Result = returnValue;
}

private void JobDone(object sender, RunWorkerCompletedEventArgs args)
{
    //RunWorkerCompletedEventArgs also has a 'Result' object like DoWorkEventArgs
    double updatedReturnValue = (double)args.Result;

    // Post-processing: e.g. use updatedReturnValue to update a text block, show a message box etc.
}

答案 4 :(得分:-1)

您正在尝试与BackgroundWorker进行同步操作, BAD 。但如果必须,可以使用IsBusy标志。

double returnValue = 0;

var b = new BackgroundWorker();
b.DoWork += new DoWorkEventHandler(
    delegate(object sender, DoWorkEventArgs e) {
        for(int i=0;i<100;i++){
            returnValue += (i+1);
        }
    }
);

b.RunWorkerAsync();
while(b.IsBusy){
  Application.DoEvents();
}
return returnValue;