Ponieważ Invoke
/ BeginInvoke
accepts Delegate
(zamiast delegata o określonym typie), musisz powiedzieć kompilatorowi, jaki typ delegata ma utworzyć; MethodInvoker
(2.0) lub Action
(3.5) to typowe wybory (zauważ, że mają ten sam podpis); tak:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Jeśli chcesz przekazać parametry, sposobem na to są „przechwycone zmienne”:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(uwaga: musisz być nieco ostrożny, jeśli używasz przechwytywania asynchronicznego , ale synchronizacja jest w porządku - tj. powyższe jest w porządku)
Inną opcją jest napisanie metody rozszerzającej:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
następnie:
this.Invoke(delegate { this.Text = "hi"; });
this.Invoke(() => { this.Text = "hi"; });
Możesz oczywiście zrobić to samo z BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Jeśli nie możesz użyć języka C # 3.0, możesz zrobić to samo ze zwykłą metodą wystąpienia, prawdopodobnie w Form
klasie bazowej.