System.Windows.Threading.Dispatcher.BeginInvoke
を呼び出そうとしています。メソッドのシグネチャは次のとおりです。
BeginInvoke(Delegate method, params object[] args)
デリゲートを作成する代わりに、ラムダを渡そうとしています。
_dispatcher.BeginInvoke((sender) => { DoSomething(); }, new object[] { this } );
それは私に言っているコンパイラエラーを与えています
ラムダをSystem.Delegateに変換できません。
デリゲートの署名は、パラメーターとしてオブジェクトを取り、voidを返します。私のラムダはこれと一致しますが、まだ機能していません。私は何が欠けていますか?
このメソッドは 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));
短い:
_dispatcher.BeginInvoke((Action)(() => DoSomething()));
インラインLambdaの使用...
Dispatcher.BeginInvoke((Action)(()=>{
//Write Code Here
}));
プロジェクトからSystem.Windows.Presentation.dllを参照し、using System.Windows.Threading
その後、ラムダ構文を使用できる拡張メソッドにアクセスできます。
using System.Windows.Threading;
...
Dispatcher.BeginInvoke(() =>
{
});
このための拡張メソッドを作成します。例えば。
_public static void BeginInvoke(this Control control, Action action)
=> control.BeginInvoke(action);
_
これで、フォーム内からthis.BeginInvoke(() => { ... })
を呼び出すことができます。