web-dev-qa-db-ja.com

Dispatcher.BeginInvoke:ラムダをSystem.Delegateに変換できません

System.Windows.Threading.Dispatcher.BeginInvokeを呼び出そうとしています。メソッドのシグネチャは次のとおりです。

BeginInvoke(Delegate method, params object[] args)

デリゲートを作成する代わりに、ラムダを渡そうとしています。

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

それは私に言っているコンパイラエラーを与えています

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

デリゲートの署名は、パラメーターとしてオブジェクトを取り、voidを返します。私のラムダはこれと一致しますが、まだ機能していません。私は何が欠けていますか?

71
Micah

このメソッドは System.Delegate をとるので、そのように宣言された特定のタイプのデリゲートを与える必要があります。これは、次のように、キャストまたはnew DelegateTypeを介した指定されたデリゲートの作成を介して実行できます。

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

また、 SLaks が指摘しているように、 Dispatcher.BeginInvoke はparams配列を取るため、次のように書くことができます。

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

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

_dispatcher.BeginInvoke(new Action(this.DoSomething));
68
Reed Copsey

短い:

_dispatcher.BeginInvoke((Action)(() => DoSomething()));
67
Erwin Mayer

インラインLambdaの使用...

Dispatcher.BeginInvoke((Action)(()=>{
  //Write Code Here
}));
5
John Peters

プロジェクトからSystem.Windows.Presentation.dllを参照し、using System.Windows.Threadingその後、ラムダ構文を使用できる拡張メソッドにアクセスできます。

using System.Windows.Threading;

...

Dispatcher.BeginInvoke(() =>
{
});
5
logicnet.dk

このための拡張メソッドを作成します。例えば。

_public static void BeginInvoke(this Control control, Action action)
    => control.BeginInvoke(action);
_

これで、フォーム内からthis.BeginInvoke(() => { ... })を呼び出すことができます。

1
Shaun Luttin