2011-08-19 3 views
1

Je suis nouveau dans le monde des threads, j'ai moins (n ​​') idée sur le threading. S'il vous plaît, aidez-moi à résoudre mon problème suivant.Threading avec des listes génériques

  1. J'ai 2 listes génériques (list1, list2)
  2. J'itérer creux list1
  3. Effectuer un traitement et doivent mémoriser le résultat dans liste2

J'ai besoin de traiter les éléments de list1 lot par lot dans un nombre donné de threads, stocker toutes les sorties dans une seule liste (liste2)

Q1. Comment faire des lots à partir de list1 et donner aux threads?
Q2. Comment nous identifions quand une bande de roulement a fini son opération?
Q3. Comment nous donnons l'article suivant à la bande de roulement finie?
Q4. Cela va-t-il causer l'accès aux problèmes de list2 (puisque plusieurs threads y accèdent)?

+0

s'il vous plaît montrer du code ... qu'avez-vous déjà essayé? – Yahia

+0

J'ai un gros code et plus difficile (et peu pratique) à montrer ici. Comme je l'ai dit je n'ai aucune idée de comment faire cela avec le filetage. Mon code ne fonctionne que dans un seul thread, ce que je dois faire est de le faire multi-thread –

+0

var list2 = list1.AsParallel(). AvecDegreeOfParallelism (BatchSize) .Select (x => x.SomeProcessing()).() – adrianm

Répondre

2

Vous cherchez peut-être pour les classes dans le

System.Collections.Concurrent 
espace de noms

.

Microsofts MSDN a listet quelques articles sur la liste dans un environnement multi-threading: Parallel programming series Vous cherchez peut-être le dernier article de celui-ci: Blocking Collection and the Producer-Consumer Problem

Il y a un article plus long et spécialisée Concurrent Collections in the .NET Framework 4 par Bill Wagner qui va plus profond dans le sujet.

3

Q1. Comment faire des lots à partir de list1 et donner aux threads?

Parallel.ForEach serait un bon début; see MSDN

Q2. Comment nous identifions quand une bande de roulement a fini son opération?

Parallel.ForEach gérera cela; une fois que le ForEach est terminé, tout le travail est terminé

Q3. Comment nous donnons l'article suivant à la bande de roulement finie?

Encore une fois, Parallel.ForEach poignées

Q4. Cela va-t-il causer l'accès aux problèmes de list2 (puisque plusieurs threads y accèdent)?

Oui; donc soit synchroniser l'accès (lock etc lors de l'ajout), ou utiliser un ConcurrentBag<T>

+0

ForEach va itérer un par un, n'est ce pas? J'ai besoin de traiter plusieurs éléments de list1 en même temps, dans différents threads. –

+0

@Buddhi non, ce ne sera pas - 'Parallel.ForEach' - l'indice est dans le mot" Parallèle ". Voir MSDN: http://msdn.microsoft.com/en-us/library/dd992001.aspx –

+0

D'accord ... en utilisant Parallel.ForEach résoudra vos problèmes sans causer de maux de tête: D – Jonathan

Questions connexes