Question

Je l'ai vu la configuration commune pour l'accès à une déformation du filetage de contrôle de l'interface graphique, comme discuté ici: Shortest façon d'écrire une méthode d'accès thread-safe à un contrôle des formulaires de fenêtres

Tous les hits web que je trouve décrire une chose semblable.

Cependant, pourquoi avons-nous besoin de vérifier InvokeRequired? On ne peut pas simplement appeler Invoke directement?

Je suppose que la réponse est non, donc ma vraie question est « pourquoi »?

Était-ce utile?

La solution

De fils non-UI nous ne pouvons pas toucher l'interface utilisateur - très mauvaises choses peuvent se produire, car les contrôles ont une affinité de fil. Donc, à partir d'un fil non-UI nous devons (à un minumum) appel Invoke ou BeginInvoke.

Pour l'interface utilisateur-threads, cependant - nous ne pas veulent appeler beaucoup de Invoke de temps; la question est que si vous sont déjà sur le thread d'interface utilisateur, il a encore la surcharge inutile d'envoyer un message à la pompe de la forme et de la traiter.

En réalité, dans la plupart du code de thread vous savoir vous vous attendez à une méthode spécifique à appeler sur un fil non -UI , donc dans ces cas, il n'y a pas supplémentaire frais généraux:. il suffit d'appeler Invoke

Autres conseils

InvokeRequired vous dit, fondamentalement, si vous exécuter sur le fil droit ou non. Si vous n'êtes pas sur le bon fil, vous devez rassembler la tâche au fil correcte sinon vous ne le faites pas. D'où la nécessité pour le contrôle.

Le problème est que les contrôles de l'interface graphique ont une exigence que seul l'exécution de code sur le même thread qui a été utilisé pour instancier le contrôle de l'interface graphique peut accéder au contrôle de l'interface graphique. Les raisons de cette exigence sont liées à la façon que Windows est architecturé. Qu'il suffise de dire, il serait très difficile de changer cela.

Le InvokeRequired vérifie l'identité du fil exécution en cours contre l'identité du fil d'instanciation. Si elles sont les mêmes, le code peut interagir librement avec le contrôle. Dans le cas contraire, le code doit rassembler les données sur le thread courant au fil de l'instanciation. Ce processus est coûteux et lent et doit être évitée si possible. Votre code ne fonctionnera que si vous invoquez toujours et il se peut que vous ne remarquerez pas le coup de la performance, mais ce scénario va être de plus en plus commun que les systèmes multi-core sont en service. Il est préférable de ne pas créer un code « nœuds » qui doivent être annulées plus tard.

Si vous essayez d'appeler avant une poignée de fenêtre est créée (par exemple, lors de l'appel constructeur de formulaire), vous obtiendrez un InvalidOperationException. Donc, vérifiez généralement InvokeRequired est nécessaire.

Voir MSDN pour plus de détails.

L'une des raisons que je peux penser est performence. Si la plupart du temps le fil d'appel est le même que le fil de création, alors vous aurez des frais généraux unnessecry.

Le Invoke va appeler le code par délégué et non pas directement ce qui serait coûteux.

Son coût efficace pour appeler Invoke seulement quand il fallait. Par conséquent, InvokeRequired est utilisé pour savoir est l'appel étant réalisé à partir même fil ou un autre thread?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top