2009-09-16 5 views
1

Que fait exactement cette méthode? Je pensais que c'était peut-être sorti dans un fil séparé, mais manipulé des choses comme la mise à jour de contrôle sur le fil correct. Mais maintenant je commence à penser que cela fonctionne peut-être simplement sur le fil de l'interface utilisateur. Ce qui signifie que l'appel BeginInvoke sur un contrôle de l'interface utilisateur est à peu près le même que l'appel Invoke? Ou?C#: Où Control.BeginInvoke s'exécute-t-il?

Répondre

5

Il ajoute fondamentalement le délégué à une file d'attente de "tâches à exécuter". Le thread d'interface utilisateur exécute ces tâches dans l'ordre.

La différence entre Control.Invoke et Control.BeginInvoke est essentiellement que Control.Invoke bloquer le thread de travail jusqu'à ce que la tâche a exécuté sur le thread d'interface utilisateur, alors que BeginInvoke ne fonctionne pas. Je ne suis pas sûr s'il existe une différence entre BeginInvoke et Invoke lorsque vous l'appelez à partir du thread UI.

+0

Donc, fondamentalement, BeginInvoke est agréable à utiliser à partir de threads qui ne sont pas le thread de l'interface utilisateur, il n'a donc pas à attendre que l'interface utilisateur se mette à jour elle-même. – Svish

+0

Exactement - mais seulement quand vous n'avez vraiment * pas * besoin d'attendre que l'interface utilisateur se mette à jour :) –

+0

Exactement. Mais c'était logique! Merci :) – Svish

0

Je ne suis pas sûr à 100% d'avoir cette dernière phrase.

Il contient "de l'interface utilisateur ...", cela signifie-t-il que "vous appelez BeginInvoke à partir du même thread sur lequel l'interface utilisateur vit?" ou "sur un contrôle de l'interface utilisateur", c'est-à-dire un contrôle qui fait partie de l'interface utilisateur? Quoi qu'il en soit, les deux méthodes finissent par exécuter le délégué en question sur le même thread que l'interface utilisateur. La différence est bien sûr que les blocs Invoke et BeginInvoke ne le sont pas. Le blocage concerne le fil qui fait l'appel.

0

Control.BeginInvoke est généralement utilisé pour mettre à jour l'interface utilisateur/contrôle sur le thread qui a créé l'interface utilisateur. Les éléments d'interface utilisateur ont une contrainte de conception qui ne peut être mise à jour qu'à partir du thread de création. Par conséquent, pour mettre à jour l'interface utilisateur à partir d'un autre thread (worker/threadpool), vous devez basculer vers le thread approprié. Control.BinInInvoke le fait pour vous - de manière asynchrone (en ce sens que vous ne bloquez pas tant que le délégué n'est pas exécuté). Invoke fait la même chose sauf que vous bloquez jusqu'à ce que le délégué ait été exécuté.

1st google result - WinForms UI Thread Invokes: An In-Depth Review of Invoke/BeginInvoke/InvokeRequred

0

Notez que si vous utilisez Control.BeginInvoke pour appeler un délégué qui retourne quelque chose, vous pouvez alors utiliser Control.EndInvoke pour accéder à la valeur retournée. Si le délégué n'a pas encore été exécuté, EndInvoke se bloque jusqu'à ce qu'il soit retourné.

Questions connexes