以下代码将数字从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;
附录:在同一个线程上发送消息泵而不是在后台工作者上运行它会更好吗?
此外,这只是示例代码,我的实际代码需要一分多钟才能完成。
答案 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;