2010-08-26 3 views
3

Selon l'exemple Single-Threaded Application with Long-Running Calculation MSDN, il existe une possibilité de créer une interface utilisateur graphique réactive dans seulement 1 thread. Merci à l'objet Dispatcher, car nous pouvons définir la priorité des éléments de travail. Ma question est, quel sens a-t-il de faire des tâches simples (en supposant que nous ayons seulement 1 cpu single core) dans un thread d'arrière-plan lorsque cela est possible?Dispatcher vs multithread

Merci

Répondre

4

Essentiellement l'exemple a rompu la seule tâche de « trouver autant de nombres premiers que vous pouvez » dans de nombreuses étapes individuelles en cours d'exécution rapide qui sont exécutées à une très faible priorité, de sorte qu'ils » Il est peu probable d'interrompre un utilisateur qui interagit avec la fenêtre. Un inconvénient que je ressens est qu'il oblige le programmeur à diviser une tâche en plusieurs petites étapes que nous devons garantir que l'on peut exécuter rapidement. Lorsque l'une de ces tâches est en cours d'exécution, elle bloque l'interface utilisateur pendant toute la durée de celle-ci. Envisagez de télécharger un fichier. Prendre la seule étape de connexion à un site FTP peut prendre 20 secondes ou plus, période pendant laquelle l'interface utilisateur est gelée.

Comparez cela avec un fil de discussion approprié faisant tout le téléchargement en une seule fois, ramenant les mises à jour au fil de l'interface utilisateur. Même sur une seule machine principale, cela devrait offrir une expérience utilisateur raisonnable.

L'inconvénient suivant est que vous exécutez maintenant du code sur un seul thread. Ce n'est pas aussi bon que ça en a l'air. En raison de la façon dont les petites tâches individuelles sont mises en file d'attente, d'autres tâches (tout ce qui est poussé dans la file d'attente des messages de la fenêtre) ont une chance de sauter et de s'exécuter entre elles. Si l'état que vos tâches spéciales utilisent n'est pas correctement isolé, vous pouvez obtenir des problèmes qui ressemblent à des problèmes de thread mais pas, et pire encore, vous ne pouvez pas vous protéger de ces problèmes en utilisant le verrouillage, car toutes les actions sont effectuées sur le même fil. Il y a des inconvénients similaires en utilisant Application.DoEvents(), (bien qu'il y ait quelques trucs supplémentaires qui peuvent continuer avec ça qui ne peuvent pas continuer ici). Donc, la technique que vous avez décrite peut être utilisable dans certaines situations, et peut-être pas pour d'autres. J'opterais donc pour la technique qui est toujours applicable, qui exécute le code sur un fil de fond.

Je pense que la réponse est généralement la même pour la plupart 'utiliser un seul thread tout en gardant les questions sensibles à l'interface utilisateur'. Tu ne peux pas vraiment. Vous devez mordre la balle et apprendre à enfiler correctement. Réfléchissez bien, isolez votre état, protégez l'état en utilisant l'immuabilité et le verrouillage et organisez correctement les appels entre les threads si nécessaire.

+0

Merci pour votre réponse +1 –