33 votes

Délégués asynchrones Vs Thread / ThreadPool?

J'ai besoin d'exécuter 3 tâches en parallèle et après chaque tâche, elles doivent appeler la même fonction qui affiche les résultats.

Je ne comprends pas dans .net pourquoi nous avons un appel Asychronous (delegate.BeginInvoke () & delegate.EndInvoke ()) ainsi que la classe Thread?

Je suis un peu confus lequel utiliser quand? Maintenant, dans ce cas particulier, que dois-je utiliser l'appel Asychronous ou la classe Thread?

J'utilise C #.

44voto

claws Points 8398

1. Asynchrone Délégués

Asychronous appelant est utilisé lorsque vous avoir des éléments de travail qui doit être traitée en arrière-plan et vous les soins lors de l' ils ont fini.

http://stackoverflow.com/questions/1506838/backgroundworker-vs-background-thread/1507337#1507337

2. BackgroundWorker

  • Utilisation BackgroundWorker si vous avez une seule tâche qui s'exécute dans le contexte et besoin d'interagir avec l'INTERFACE utilisateur. et de l'utiliser si vous n'avez pas de soins quand ils ont fini leur tâche. La tâche de regroupement des données et les appels de méthode pour le thread d'INTERFACE utilisateur sont traitées automatiquement par le biais de ses événement à base de modèle.
  • Éviter BackgroundWorker si (1) votre assemblée n'a pas déjà référence du Système.De Windows.Formulaire de l'assemblée, (2) vous devez le fil à un thread de premier plan, ou (3) vous besoin de manipuler le fil de priorité.

3. ThreadPool

  • L'utilisation d'un pool de threads thread lorsque l'efficacité est souhaitée. Le Pool De Threads permet d'éviter les frais généraux associés avec la création, le démarrage et l'arrêt les threads.
  • Évitez d'utiliser le pool de threads si (1) la tâche s'exécute pour la durée de vie de votre application, (2) vous devez le fil un thread de premier plan, (3) vous besoin de manipuler le fil la priorité, ou (4) vous devez le fil avoir une identité fixe (abandon, la suspension de, la découverte).

4. Classe Thread

  • Utiliser la classe Thread pour les longues tâches en cours d'exécution et lorsque vous besoin de fonctionnalités offertes par un officiel modèle de thread, par exemple, le choix d' entre le premier plan et d'arrière-plan threads, le fait de modifier la priorité de thread, le contrôle fin sur fil d'exécution, etc.

12voto

Jonathan Allen Points 23540

Je ne comprends pas dans .net pourquoi nous avons Asychronous appelant (délégué.BeginInvoke() & délégué.EndInvoke()) ainsi que la classe Thread?

  • Asychronous appelant est utilisé lorsque vous avez des éléments de travail qui devraient être traités en arrière-plan et vous vous souciez de la date de leur arrivée.

  • Les pools de threads sont quand vous avez des éléments de travail qui devraient être traités en arrière-plan et vous n'avez pas de soins quand ils ont fini.

  • Les Threads sont pour faire des trucs qui ne se termine jamais.

Exemples:

Si vous êtes à la lecture d'un fichier volumineux sur le disque et ne voulez pas bloquer le thread GUI, l'utilisation d'un appel asynchrone.

Si vous êtes paresseusement à l'écriture d'un ou de plusieurs fichiers en arrière-plan, l'utilisation d'un pool de threads.

Si vous êtes de l'interrogation du système de fichiers en quelques secondes à la recherche pour des choses qui ont changé, l'utilisation d'un thread.

5voto

FlySwat Points 61945

Une méthode async essentiellement abstraction de la manière dont le travail est en cours de traitement. Il peut être généré dans un nouveau processus, il peut être exécuté dans un thread séparé...Il n'a pas d'importance.

Tout ce qui importe est que vous dites:

  1. Exécutez ce code lorsque vous démarrez.
  2. Et d'exécuter ce code lorsque vous avez terminé.

Si le choix, je vais utiliser une API asynchrone de la méthode sur la mise en œuvre de mon propre filetage mécanisme de tous les temps. Le cadre développeurs ont fait le travail dur pour vous, pourquoi réinventer la roue.

3voto

Daniel Earwicker Points 63298

Je ne comprends pas dans .net pourquoi nous avons Asychronous appel (délégué.BeginInvoke() & délégué.EndInvoke()) ainsi que Classe Thread?

Généralement la raison pour laquelle - même dans un système bien conçu - il y a toujours plusieurs façons de faire une chose, c'est parce que certaines choses sont de haut niveau des installations construites à faible niveau. Si il y a un haut niveau de l'installation qui convient à vos besoins, c'est votre jour de chance. Si non, vous devez construire vous-même en utilisant le faible niveau des installations.

L' Thread classe utilise Win32 l' BeginThread, de sorte que vous n'avez pas à. Le pool de threads utilise l' Thread classe, de sorte que vous n'avez pas à. BeginInvoke utilise le pool de threads, de sorte que vous n'avez pas à, et ainsi de suite.

1voto

Jose Points 1

C'est depuis longtemps oublié thread, mais quelque chose qui n'était pas mentionné ici tout ce qu'il y a deux type de travail, de Calcul et de I/O bound.

Dans le cas de Calcul lié au travail, c'est exécutée dans un thread séparé (si vous utilisez BackgroundWorker ou Begin/End modèle, c'est à partir du pool de Threads; ou, une coutume de fil si vous avez décidé de créer votre propre thread).

I/O bound sur l'autre main est exécuté dans les ports d'e/S (prise en charge matérielle), et ne nécessitent pas d'un fil; accès aux Fichiers et les sockets Réseau sont deux exemples d'e/S à des tâches limitées.

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