开发者

BackgroundWorker Return A Value?

开发者 https://www.devze.com 2023-02-15 20:52 出处:网络
The following code adds the numbers from 1 to 100 and returns the sum.What I\'m trying to do is run the calculations in a backgroundworker and return a value.The problem with this is that returnValue

The following code adds the numbers from 1 to 100 and returns the sum. What I'm trying to do is run the calculations in a backgroundworker and return a value. The problem with this is that returnValue is returned before DoWork completes. How can I have it wait for my background worker to complete before returning a value? (I can't seem to put the return in my 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;

Addendum: Wou开发者_JAVA百科ld it be better to send a message pump on the same thread instead of running this on a background worker?

Also, this is just example code, my actual code takes more than a minute to complete.


Subscribe to the RunWorkerCompleted event. That event contains the return value of the background operation.

Of course, that value would be returned from inside the DoWorkEventHandler, like so:

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


I don't really see a question here, but what I think you are looking for is the event called RunWorkerCompleted. That gets raised when the DoWork delegate completes. If this is not what you are looking for, I think you need to rephrase your question.


i have postet a sample: here maybe it can help you :-)

Also, this is just example code, my actual code takes more than a minute to complete.

this can be the effect of the async start. you can tell the backgroundworker when to start or just say start. if you don´t explicit say that he should start NOW he starts when c# thinks it is a good time to start :-)


If, like me, you were not able to use the accepted answer because DoWorkEventHandler returns void, the code below might help.

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.
}


You are trying to do a synchronous operation with BackgroundWorker which it BAD. But if you must, you could use the IsBusy flag.

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;
0

精彩评论

暂无评论...
验证码 换一张
取 消