2009-11-05 4 views
1

J'ai une liste de plus de 300 000 articles. Ce que je fais actuellement avec la liste valide l'adresse et écrit l'adresse d'origine et l'adresse corrigée dans un fichier spécifié. Qu'est-ce que je voudrais faire est de diviser la liste de manière égale entre un nombre donné de threads et faire des processus sur eux en même temps. Quelqu'un peut-il m'aider avec un exemple sur la façon dont je peux faire quelque chose comme ça?Plusieurs threads traitant des données d'une liste

Merci

+0

Y a-t-il un seul fichier de sortie? –

+0

Oui, il y aurait un fichier de sortie final. – AlteredConcept

Répondre

1

Si vous travaillez dans la version 2.0 et la liste est uniquement utilisé dans une lecture seule la mode (pas changé alors que ce traitement est INTERVENUES) alors vous pouvez simplement diviser les indices . Par exemple ...

public void Process(List<Item> list, int threadCount) { 
    int perThread = list.Count < threadCount ? list.Count : list.Count/threadCount; 
    int index = 0; 
    while (index < list.Count) { 
    int start = index; 
    int count = Math.Min(perThread,list.Count-start); 
    WaitCallBack del = delegate(object state) { ProcessCore(list, start, count); }; 
    ThreadPool.QueueUserWorkItem(del); 
    index += count; 
    } 
} 

private void ProcessCore(List<Item> list, int startIndex, int count) { 
    // Do work here 
} 
+0

S'il y a un seul fichier de sortie, vous devrez inclure le verrouillage de fichier (je passerais probablement un seul StreamWriter à la fonction thread, bien qu'il puisse y avoir un meilleur moyen). –

1

Conceptuellement, il est assez simple, étant donné deux hypothèses:

  • Vous ne changez pas la liste au cours du traitement .
  • Vous connaissez le nombre de threads à l'avance.

Fondamentalement, votre algorithme est le suivant:

  1. Divisez la liste en sections pour la plupart-même en fonction du nombre de threads.
  2. Donnez à chaque thread les index de début et de fin de sa section et le fichier de sortie. Dans chaque fil:
    a12. Traiter un article
    b. Verrouillez l'accès au fichier de sortie
    c. Écrire l'original et l'adresse corrigée
    d. Déverrouiller l'accès au fichier de sortie
Questions connexes