Parce que Invoke
/ BeginInvoke
accepte Delegate
(plutôt qu'un délégué typé), vous devez indiquer au compilateur le type de délégué à créer; MethodInvoker
(2.0) ou Action
(3.5) sont des choix courants (notez qu'ils ont la même signature); ainsi:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Si vous avez besoin de passer des paramètres, alors les "variables capturées" 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 des captures asynchrones , mais la synchronisation est bien - c'est-à-dire que ce qui précède est bien)
Une autre option consiste à écrire une méthode d'extension:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
puis:
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 de même avec BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Si vous ne pouvez pas utiliser C # 3.0, vous pouvez faire la même chose avec une méthode d'instance régulière, probablement dans une Form
classe de base.