2010-02-12 5 views
2

Je dois effectuer 3 opérations asynchrones parallèlement dans un service Windows NT (en utilisant .Net2.0/C#). Pour cela, j'utilise le composant Backgroundworker.BackgroundWorker Thread - C#

  1. Est-ce une bonne option/approche?
  2. Pour un fonctionnement continu, j'appelle à nouveau RunWorkerAsync() dans l'événement RunWorkerCompleted.

Je vous suggère.

Répondre

1

Généralement BackgroundWorker est utilisé pour les opérations de longue durée. Si vous avez juste besoin d'exécuter 3 tâches en parallèle, vous pouvez utiliser des threads simples.

+0

Toutes les 3 opérations sont aussi des opérations de longue durée. Implique beaucoup de traitement. L'un d'eux consiste à copier de gros fichiers MB dans un dossier. Donc, devrais-je encore recourir à des fils normaux. Je ne suis pas très clair et confiant. – DotNetGuy

+0

Si vous n'avez pas besoin d'alertes concernant les modifications apportées et la tâche terminée - vous pouvez utiliser des threads sinon utiliser le worker de fond. – sashaeve

1

Habituellement, BackgroundWorker est utilisé lorsque vous avez besoin de RunWorkerCompleted pour effectuer des mises à jour dans une interface graphique. Au moins, c'est comme ça que je l'utilise. Il semble que vous voulez que cela fonctionne constamment, alors pourquoi ne pas utiliser un thread de travail régulier? Le plus gros problème que je vois est que BackgroundWorker utilise le pool de threads .NET, donc si vous voulez vraiment que cela fonctionne continuellement, vous avez juste garanti d'utiliser l'un des threads du pool de threads, dont il existe un nombre limité nombre disponible.

+0

Est-il incorrect d'utiliser des threads de pool de threads? – DotNetGuy

+0

Je pense que cela dépend. Je les utilise tout le temps en ce moment, et je n'ai même pas utilisé de threads normaux. Mais vous devez être conscient de la limite des threads du pool de threads. BackgroundWorker, Windows Workflow, et je pense que l'utilisation de BeginInvoke sur les délégués utilise le pool de threads. Je parie que c'est assez facile de courir dans une application compliquée. – Dave

+0

Cool! À l'avenir, si j'ai besoin de mettre à jour une sorte d'interface utilisateur pour illustrer le progrès de l'une des 3 opérations, alors BckgrndWrkr sera utile. Et, prévoyez-vous des problèmes en appelant à nouveau RunWorkerAsync() dans l'événement RunWorkerCompleted? – DotNetGuy

0

Je n'utiliserais pas d'arrière-plan pour le travail que vous décrivez ici.

L'opérateur d'arrière-plan est destiné à être utilisé pour certaines opérations «longues» tout en conservant une interface utilisateur réactive. L'utilisation de services rompt le modèle d'interface utilisateur.

Pour un service, j'utiliserais une minuterie et trois threads.

Laissez le temporisateur vérifier l'existence des trois threads et les redémarrer ou signaler des erreurs si nécessaire. Les trois threads peuvent faire leur propre travail dans une boucle while (n'oubliez pas d'ajouter un sleep (0) dedans)

Questions connexes