100 votes

Invoke(Délégué)

Quelqu'un peut-il expliquer cette déclaration écrite sur ce enlace

Invoke(Delegate):

Exécute le délégué spécifié sur le thread qui possède l'objet la poignée de fenêtre sous-jacente du contrôle.

Quelqu'un peut-il m'expliquer ce que cela signifie (en particulier le texte en gras) ? Je ne comprends pas bien.

2voto

The Mouth of a Cow Points 4058

En termes pratiques, cela signifie que le délégué est garanti d'être invoqué sur le thread principal. C'est important car, dans le cas des contrôles Windows, si vous ne mettez pas à jour leurs propriétés sur le thread principal, soit vous ne voyez pas le changement, soit le contrôle lève une exception.

Le modèle est :

void OnEvent(object sender, EventArgs e)
{
   if (this.InvokeRequired)
   {
       this.Invoke(() => this.OnEvent(sender, e);
       return;
   }

   // do stuff (now you know you are on the main thread)
}

1voto

Marc Gravell Points 482669

Cela signifie que le délégué sera exécuté sur le thread de l'interface utilisateur, même si vous appelez cette méthode à partir d'un travailleur d'arrière-plan ou d'un thread de pool de threads. Les éléments de l'interface utilisateur ont affinité de fil - ils n'aiment parler directement qu'à un seul thread : le thread UI. Le thread UI est défini comme suit le thread qui a créé l'instance de contrôle, et est donc associé au handle de la fenêtre. Mais tout cela est un détail d'implémentation.

Le point clé est le suivant : vous appelleriez cette méthode à partir d'un fil de travail afin de pouvoir accéder à l'interface utilisateur (pour modifier la valeur d'une étiquette, etc.) - puisque vous êtes un utilisateur de l'interface utilisateur. pas autorisé de le faire à partir d'un autre thread que celui de l'interface utilisateur.

0voto

LukeHennerley Points 3980

Les délégués sont essentiellement en ligne Action ou Func<T> . Vous pouvez déclarer un délégué en dehors de la portée d'une méthode que vous exécutez ou en utilisant un lambda expression( => ) ; parce que vous exécutez le délégué dans une méthode, vous l'exécutez sur le thread qui est en cours d'exécution pour la fenêtre/application actuelle, ce qui est le bit en gras.

Exemple de lambda

int AddFiveToNumber(int number)
{
  var d = (int i => i + 5);
  d.Invoke(number);
}

0voto

user1610015 Points 4189

Cela signifie que le délégué que vous passez est exécuté sur le thread qui a créé l'objet Contrôle (qui est le thread de l'interface utilisateur).

Vous devez appeler cette méthode lorsque votre application est multithread et que vous souhaitez effectuer une opération d'interface utilisateur à partir d'un thread autre que le thread de l'interface utilisateur, car si vous essayez d'appeler une méthode sur un contrôle à partir d'un thread différent, vous obtiendrez une System.InvalidOperationException.

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