2011-12-29 111 views
1

我已經寫了一小段代碼來將Action分配給BackGroundWorker作爲Delegate。
將一個System.Action分配給一個BackgroundWorker

public BackgroundWorker GetBackgroundWorker(System.Action doWork) 
{ 
    BackgroundWorker bwk= new BackgroundWorker(); 
    bwk.DoWork += (sender, args) => { args.Result = doWork; }; 
    return bwk; 
} 

BackgroundWorker wk = GetBackgroundWorker(MY_Delegate); 
wk.RunWorkerAsync(); 

public void MY_Delegate() 
{ 
    //DO Stuff 
} 

爲了使長話短說,我很奇怪,爲什麼在我火與RunWorkerAsync呼叫的工人從來沒有進入方法MY_Delegate
也許我的「=>」我的assignement語法很糟糕。
反正,我歡迎任何有效的方法來完成這項工作

回答

5
public BackgroundWorker GetBackgroundWorker(System.Action doWork) 
{ 
    BackgroundWorker bwk= new BackgroundWorker(); 
    bwk.DoWork += (sender, args) => { doWork(); }; 
    return bw; 
} 

分配的doWork到args.Result不會調用DoWork的方法。

作爲一個方面說明:方法和變量的命名錶明您不完全理解委託,事件和lambda表達式。

+0

謝謝!我一直在弄這個bug一個小時:-)這是一個奇特的語法,我不習慣它。我嘗試修改一個基於模板的代碼:'args.Result =(K)do​​Work((T)args.Argument);'實際上'args.Result = doWork();'可以工作,但在這種情況下,一個void委託,所以這裏沒有用處。再次感謝 ! – 2011-12-29 10:35:02

+0

關於旁註,如果我真的明白了,我不會問(愚蠢的)問題:-P更嚴重:這不是我的「真實」代碼,我只是試着寫一個最小樣本來重現我所面臨的問題。我試圖從一個漂亮的博客條目中爲代碼添加一個「void」委託功能:http://pooyakhamooshi.blogspot.com/2009/11/create-thread-safe-queued.html – 2011-12-29 15:56:21

相關問題