135 votes

Méthode anonyme dans l’appel Invoke

Ayant un peu de mal avec la syntaxe où nous voulons appeler un délégué anonyme au sein d’un Control.Invoke.

Nous avons essayé un certain nombre d’approches différentes, tous à rien n’y fait.

Par exemple :

où someParameter est local à cette méthode

Ce qui précède se traduira par une erreur de compilation :

Impossible de convertir une méthode anonyme en type « System.Delegate » parce qu’il n’est pas un type délégué

228voto

Marc Gravell Points 482669

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.

52voto

Vokinneberg Points 731

En fait vous n’avez pas besoin d’utiliser le mot clé delegate. Juste passez lambda comme paramètre :

17voto

François Points 632
<pre><code></code></pre>

13voto

Jelon Points 111

Vous devez créer un type délégué. Le mot clé « délégué » dans la création de la méthode anonyme est un peu trompeur. Vous ne créez pas un délégué anonyme mais une méthode anonyme. La méthode que vous avez créé peut être utilisée dans un délégué. Comme ça :

5voto

Rory Points 13087

J’ai eu des problèmes avec les autres suggestions parce que je veux parfois les valeurs de retour de mes méthodes. Si vous essayez d’utiliser MethodInvoker avec les valeurs de retour il ne semble pas aimer ça. Donc la solution que j’utilise est comme ça (très heureuse d’entendre un moyen de rendre cela plus succinct - j’utilise c# .net 2.0) :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X