Da Invoke/ BeginInvokeakzeptiert 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 FormBasisklasse.