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;
精彩评论