BackgroundWorker Return A Value?

不想你离开。 提交于 2019-12-07 12:39:01

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!