1. ホーム
  2. c#

[解決済み] クロススレッドイベントを呼び出す最もクリーンな方法

2023-08-29 01:25:20

質問

私は、.NET イベント モデルが、しばしば、あるスレッドでイベントを発生させ、別のスレッドでそれをリッスンするようなものであることを発見しました。 私は、バックグラウンド スレッドから私の UI スレッドにイベントをマーシャルする最もきれいな方法は何であるか疑問に思っていました。

コミュニティの提案に基づいて、私はこれを使用しました。

// earlier in the code
mCoolObject.CoolEvent+= 
           new CoolObjectEventHandler(mCoolObject_CoolEvent);
// then
private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args)
{
    if (InvokeRequired)
    {
        CoolObjectEventHandler cb =
            new CoolObjectEventHandler(
                mCoolObject_CoolEvent);
        Invoke(cb, new object[] { sender, args });
        return;
    }
    // do the dirty work of my method here
}

どのように解決するのですか?

2、3の観察。

  • 2.0以前でない限り、そのようなコードで単純なデリゲートを明示的に作らないようにしましょう。
   BeginInvoke(new EventHandler<CoolObjectEventArgs>(mCoolObject_CoolEvent), 
               sender, 
               args);

  • また、argsパラメータは"params"型なのでリストを渡すだけなので、オブジェクト配列を作成して投入する必要はない。

  • 私はおそらく Invoke よりも BeginInvoke 後者はコードが非同期に呼び出されることになり、それが目的であるかどうかはわかりませんが、その後の例外処理が EndInvoke . このような場合、アプリが TargetInvocationException の代わりに