Invoke呼び出しの匿名メソッド 質問する

Invoke呼び出しの匿名メソッド 質問する

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);
}

FormC# 3.0 を使用できない場合は、おそらく基本クラス内の通常のインスタンス メソッドを使用して同じことを行うことができます。

おすすめ記事