2011-12-29 9 views
1

Actionを代理人としてBackGroundWorkerに割り当てるための小さなコードを書きました。
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が入力されることはありません、なぜ、私は疑問に思って。
多分私の割り当て構文 "=>"は吸う。
はとにかく、私はこの仕事が

答えて

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

args.ResultにdoWork割り当てると、DoWorkメソッドを呼び出すことはありませんようにする任意の効率的な方法を歓迎します。

メソッドと変数の名前は、デリゲート、イベント、ラムダ式を完全に理解していないことを示しています。

+0

ありがとうございました!私はこのバグを1時間ぐちゃぐちゃしていました:-)これは私がそれに慣れていない独特の構文です。 'args.Result =(K)do​​Work((T)args.Argument);'実際には 'args.Result = doWork();'は動作しますが、この場合は、ボイドデリゲートなのでここでは使用しません。再度、感謝します ! –

+0

サイドノートについて、私が本当に理解していれば、私は(愚かな)質問をしません:-Pもっと真剣に:これは私の "本当の"コードではありませんでした私は直面していた問題を再現するために最小サンプルを書こうとしました。私は素晴らしいコードエントリーからこのコードに "void"デリゲート機能を追加しようとしていました:http://pooyakhamooshi.blogspot.com/2009/11/create-thread-safe-queued.html –