0
Timer timer = new Timer();
BackgroundWorker bw = new BackgroundWorker();
EventHandler HandleStuff = delegate { MessageBox.Show("HandleStuff called"); };
timer.Tick += HandleStuff;
bw.RunWorkerCompleted += HandleStuff;

次の理由により、最後の行は使用できません。

タイプ 'System.EventHandler' を 'System.ComponentModel.RunWorkerCompletedEventHandler' に暗黙的に変換することはできません

2 つの質問: RunWorkerCompleted が通常の EventHandler を受け入れられないのはなぜですか - 完了したイベントはマルチスレッド化されていません。この制限が存在する理由はありますか?

さらに重要なことは、これを達成するための回避策はありますか? Timer.Tickとに同じハンドラを使いたいbw.RunWorkerCompleted

4

1 に答える 1

1

RunWorkerCompleted が通常の EventHandler を受け入れられないのはなぜですか?

署名がイベントと一致しないためです。(そして、デリゲートは共/反分散によって同等ではありません)。ハンドラーは、定義上、常にイベントのデリゲートと同じ型である必要があります。

さらに重要なことは、これを達成するための回避策はありますか?

その正確な参照に関して、その正確なハンドラーをアタッチすることはできません。あなたができる最善のことは、実際に実行したいコードを呼び出すだけで、本体が何もしない適切なタイプの新しいイベントハンドラーを作成することです。

bw.RunWorkerCompleted += (s,args)=> HandleStuff(s,EventArgs.Empty);
于 2014-06-20T16:52:07.937 に答える