问题
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: Would 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.
回答1:
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);
}
return returnValue;
}
);
回答2:
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.
回答3:
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 :-)
回答4:
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;
来源:https://stackoverflow.com/questions/5224276/backgroundworker-return-a-value