Invoke
/は(型指定されたデリゲートではなく)BeginInvoke
受け入れるため、作成するデリゲートの型をコンパイラに伝える必要があります。(2.0) または(3.5) は一般的な選択肢です (署名が同じであることに注意してください)。そのようです:Delegate
MethodInvoker
Action
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
パラメータを渡す必要がある場合は、「キャプチャされた変数」がその方法です。
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(警告: キャプチャasyncを使用する場合は少し注意する必要がありますが、同期は問題ありません。つまり、上記は問題ありません)
別のオプションは、拡張メソッドを記述することです。
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
それから:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
もちろん、次の方法でも同じことができますBeginInvoke
。
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
C# 3.0 を使用できない場合は、おそらくForm
基本クラスで、通常のインスタンス メソッドを使用して同じことを行うことができます。