Da Invoke
/ BeginInvoke
akzeptiert Delegate
(anstelle eines typisierten Delegaten), müssen Sie dem Compiler mitteilen, welcher Delegatentyp erstellt werden soll. MethodInvoker
(2.0) oder Action
(3.5) sind gängige Optionen (beachten Sie, dass sie dieselbe Signatur haben). wie so:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Wenn Sie Parameter übergeben müssen, sind "erfasste Variablen" der richtige Weg:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(Einschränkung: Sie müssen etwas vorsichtig sein, wenn Sie asynchrone Captures verwenden , aber die Synchronisierung ist in Ordnung - dh die oben genannten sind in Ordnung.)
Eine andere Möglichkeit besteht darin, eine Erweiterungsmethode zu schreiben:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
dann:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
Sie können das natürlich auch tun mit BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Wenn Sie C # 3.0 nicht verwenden können, können Sie dasselbe mit einer regulären Instanzmethode tun, vermutlich in einer Form
Basisklasse.