2011-03-07 69 views
3

以下代碼添加從1到100的數字並返回總和。我想要做的是在後臺工作中運行計算並返回一個值。這個問題是在DoWork完成之前返回returnValue。如何在返回值之前等待我的後臺工作人員完成? (我似乎無法把我的DoWork的回報...)BackgroundWorker返回值?

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; 

附錄:它會更好發送相同的線程上的消息泵,而不是在後臺工作運行這個的?

此外,這只是示例代碼,我的實際代碼需要一分多鐘才能完成。

+1

幾乎相同的問題,如http://stackoverflow.com/questions/939635/how-to -make-backgroundworker-return-an-object – 2011-03-07 19:37:32

+0

可能的重複http://stackoverflow.com/questions/5182782/c-return-value-from-function-invoked-in-thread/5201814#5201814 – 2011-03-07 19:37:46

+1

你在問什麼做沒有意義;你試圖在'BackgroundWorker'上執行代碼,但你也想阻止調用方法返回,直到完成'BackgroundWorker'。 – 2011-03-07 19:38:35

回答

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; 
    } 
); 
+0

是的,這工作得很好。我也喜歡返回值可以是一個對象或結構。 – mtone 2011-03-07 19:41:33

+0

not worked.error DoWorkEventHandler返回void,返回關鍵字後面不能有對象 – 2016-11-08 05:26:26

0

我實在不明白一個問題在這裏,但我認爲你正在尋找的是事件稱爲RunWorkerCompleted 。當DoWork委託完成時會引發此問題。如果這不是你正在尋找的,我認爲你需要改寫你的問題。

-1

您正在嘗試使用BackgroundWorker執行同步操作,它是不好意思。但是,如果你必須的話,你可以使用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; 
+1

這有點違背了BackgroundWorker的用途。 – Bryan 2011-03-07 19:36:18

+0

@Bryan準確。但是如果他必須等待BackgroundWorker完成,那麼爲什麼要使用BackgroundWorker? – 2011-03-07 19:37:29

+0

消息泵會更好嗎? – sooprise 2011-03-07 19:40:36

0

我已經postet樣本:here 也許它可以幫助你:-)

而且,這只是示例代碼,我實際的代碼需要超過一分鐘才能完成。

這可能是異步啓動的影響。你可以告訴背景工作者何時開始或只是說開始。如果你沒有明確說他現在應該開始,他開始時,C#認爲這是一個好時機開始:-)