2010-06-25 3 views
0

J'ai juste appris environ queues in .NET et j'ai quelques questions. Supposons que je construise une application qui télécharge le code HTML des pages, puis le traite. Voici comment je veux le faire fonctionner:Utilisation d'une file d'attente dans une situation multithread en C#

  1. Un thread principal ajoute URL à une file d'attente
  2. Cette file d'attente est lu par deux autres fils. Ils "déqueue" une URL puis téléchargent le HTML correspondant.
  3. Le code HTML est ensuite renvoyé au thread principal.
  4. Lorsque le code HTML arrive dans le thread principal, il est placé dans une autre file d'attente, gérée par deux autres threads. Ces threads traitent le code HTML.
  5. Les résultats du traitement sont renvoyés au thread principal.

Comment puis-je mettre en œuvre un tel scénario sans la possibilité d'une condition de course?

En outre, quel est le meilleur moyen de transmettre l'information entre les files d'attente et les threads comme décrit ci-dessus?

Pourriez-vous m'en donner exemple de code?

Merci!

+1

http://msdn.microsoft.com/fr-fr/library/dd267265.aspx –

+1

Pourquoi le premier ensemble de threads doit-il renvoyer le code HTML au thread principal? Il semble que vous souhaitiez plusieurs files d'attente, car cela sent comme si vous construisiez une sorte de pipeline de traitement. Vous avez généralement une file d'attente entre chaque étape du pipeline. – Andrew

+1

Selon le scénario (je suppose que c'est hypothétique), vous pouvez également envisager de ne pas avoir de threads dédiés pour certaines tâches comme celle-ci et adopter plutôt une approche TPL ("thread-agile") où vous pourriez avoir des tâches de téléchargement traiter les tâches et ensuite consommer le résultat (ContinueWithAll, ou ContinueWith, ou autre selon si vous vouliez agir par résultat ou attendre tous les résultats). Voir TPL @ http://msdn.microsoft.com/en-us/library/dd460717.aspx et DownloadStringTask @ http://blogs.msdn.com/b/pfxteam/archive/2010/04/23/10001621.aspx –

Répondre

1

Je recommande BlockingCollection<T>. Il représente une "file d'attente producteur/consommateur" commune au multithreading.

0

Il y a deux façons qui me viennent à l'esprit.

La première consiste à utiliser une collection qui implémente le verrouillage pour produire une cohérence sans danger pour les threads (telle que BlockingCollection comme mentionné ailleurs). La seconde est d'utiliser une collection immuable (comme celles décrites par Eric Lippart dans http://blogs.msdn.com/b/ericlippert/archive/2007/11/13/immutability-in-c-part-one-kinds-of-immutability.aspx) qui évite en premier lieu la plupart des embûches du blocage des threads et des conditions de course et rend ce qui reste un peu plus évident d'habitude.