Parce qu' Invoke
/BeginInvoke
accepte Delegate
(plutôt que de tapé délégué), vous devez indiquer au compilateur quel type de déléguer à créer ; MethodInvoker
(2,0) ou Action
(3.5) sont des choix communs (à noter qu'ils ont la même signature); de la sorte:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Si vous devez passer dans les paramètres, puis "capturé variables" sont le moyen:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(mise en garde: vous devez être un peu prudent si vous utilisez capture async, mais la synchronisation est très bien - c'est à dire la-dessus est très bien)
Une autre option est d'écrire une extension de la méthode:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
alors:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
Vous pouvez bien sûr faire la même chose avec BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Si vous ne pouvez pas utiliser le C# 3.0, vous pouvez faire de même avec une méthode d'instance, sans doute en Form
de la classe de base.