1. ホーム
  2. c#

[解決済み] Dispatcher.BeginInvoke。ラムダをSystem.Delegateに変換できない

2023-06-27 11:05:27

質問

私は System.Windows.Threading.Dispatcher.BeginInvoke . メソッドのシグネチャはこうなっています。

BeginInvoke(Delegate method, params object[] args)

Delegateを作る必要がなく、Lambdaで渡そうとしています。

_dispatcher.BeginInvoke((sender) => { DoSomething(); }, new object[] { this } );

というコンパイラーエラーが出ます。

はラムダをSystem.Delegateに変換できません。

デリゲートのシグネチャは、オブジェクトをパラメータとして受け取り、voidを返します。私のラムダはこれに一致しますが、まだ動作していません。何が足りないのでしょうか?

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

このメソッドは システム.デリゲート を取るので、そのように宣言された特定のタイプのデリゲートを与える必要があります。 これは、以下のようにキャストするか、new DelegateTypeで指定されたデリゲートを作成することで実現できます。

_dispatcher.BeginInvoke(
     new Action<MyClass>((sender) => { DoSomething(); }),
     new object[] { this } 
  );

また SLaks が指摘しているように ディスパッチャ.BeginInvoke は params 配列を取るので、そのまま書けばいいのです。

_dispatcher.BeginInvoke(
     new Action<MyClass>((sender) => { DoSomething(); }),
     this
  );

あるいは、DoSomethingがこのオブジェクト自体のメソッドである場合。

_dispatcher.BeginInvoke(new Action(this.DoSomething));