Control.Invoke 内でデリゲートを匿名で呼び出す構文に少し問題があります。
私たちはさまざまなアプローチを試しましたが、すべて効果がありませんでした。
例えば:
myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); });
someParameterはこのメソッドに対してローカルである
上記の場合、コンパイラ エラーが発生します。
匿名メソッドはデリゲート型ではないため、'System.Delegate' 型に変換できません
ベストアンサー1
Invoke
/ は(型指定されたデリゲートではなく)BeginInvoke
を受け入れるためDelegate
、作成するデリゲートの型をコンパイラーに伝える必要があります。一般的な選択肢はMethodInvoker
(2.0) またはAction
(3.5) です (同じシグネチャを持つことに注意)。次のようになります。
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
パラメータを渡す必要がある場合は、「キャプチャされた変数」を使用します。
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(注意:キャプチャを使用する場合は注意が必要です非同期、 しかし同期問題ありません - つまり、上記は問題ありません)
別のオプションとしては、拡張メソッドを記述することです。
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);
}
Form
C# 3.0 を使用できない場合は、おそらく基本クラス内の通常のインスタンス メソッドを使用して同じことを行うことができます。