2011-09-12 2 views
1

Je suis nouveau sur C# et multi-threading et j'ai récemment rencontré un peu de blocage dans l'outil que j'écris. L'outil est conçu pour générer et lancer un tas de requêtes HttpWebRequests. En ce moment, cela fonctionne très bien avec un seul thread, mais dès que j'ai commencé à diviser la tâche parmi 3 threads de travail, le programme se bloque en me donnant le message suivant.C# Multithreading Problème/vshost32-clr.exe a cessé de fonctionner

« vshost32-clr.exe a cessé de fonctionner »

Je me demande si elle a à voir avec la façon dont je vais de faire ces discussions?

Voici l'extrait de code C# que j'utilise. Toutes les recommandations pour faire un peu moins de mauvaise qualité seraient grandement appréciées.

private void CreateDocuments() 
{ 
    int docCount = 0; 
    ArrayList vsIDs = docRepo.GetVersionIDList(); 
    ArrayList versionList = new ArrayList(); 

    foreach (string vsID in vsIDs) 
    { 
     Document[] docs = docRepo.GetVersionSeries(vsID); 
     versionList.Add(docs); 

     if (versionList.Count == 3) 
     { 
      Console.WriteLine("Launch Thread"); 

      Document[] docs1 = (Document[])versionList[0]; 
      Document[] docs2 = (Document[])versionList[1]; 
      Document[] docs3 = (Document[])versionList[2]; 

      Worker w1 = new Worker(docs1); 
      Worker w2 = new Worker(docs2); 
      Worker w3 = new Worker(docs3); 
      Thread t1 = new Thread(new ThreadStart(w1.Start)); 
      Thread t2 = new Thread(new ThreadStart(w2.Start)); 
      Thread t3 = new Thread(new ThreadStart(w3.Start)); 
      Console.WriteLine("Threads Started"); 
      t1.Start(); 
      t2.Start(); 
      t3.Start(); 
      //Wait until all threads have started 
      while (!t1.IsAlive || !t2.IsAlive || !t3.IsAlive) { Console.WriteLine("Waiting for Threads to Start"); } 
      Console.WriteLine("Wait on Threads"); 
      t1.Join(); 
      docCount += docs1.Length; 
      t2.Join(); 
      docCount += docs2.Length; 
      t3.Join(); 
      docCount += docs3.Length; 
      log.Info(docCount + " Documents Imported"); 
      versionList.RemoveRange(0, 3); 
     }    
    } 
    Console.Write("Press any key to continue . . . "); 
    Console.ReadKey(true); 
} 

public class Worker 
{ 
    ImportToolWebDAV itwd = new ImportToolWebDAV(); 
    Document[] docs; 
    public Worker(Document[] _docs) 
    { 
     docs = _docs; 
    } 
    public void Start() 
    { 
     HttpStatusCode status = HttpStatusCode.OK; 
     foreach (Document doc in docs) 
     { 
      status = itwd.createDocument(doc); 
     } 
     Console.WriteLine("Thread finished"); 
    } 
} 

Ce que cela fait (ou du moins ce qu'il devrait faire) est aller chercher des tableaux d'objets « Document », et le lancement de 3 fils de discussion pour chaque ensemble de 3 tableaux, puis d'attendre qu'ils aient fini de générer les WebDAV PUT Requests. C'est un code très grossier écrit juste pour tester le filetage, mais j'ai supposé que dans cet état c'était encore bien.

+3

Vous utilisez la même valeur d'index de tableau pour 0' 'l'accès des versionList-arr ay: 'Document [] docs1 = (Document []) versionList [0];' pour que vos threads travaillent sur les mêmes données. – Jan

+0

Pas du tout lié à votre question ... mais si vous démarrez une nouvelle application de thread et que vous pouvez utiliser .NET 4, je vous recommande d'utiliser la bibliothèque parallèle de tâches. Cela rend la gestion des tâches threadées beaucoup plus simple. –

+0

Correction de la faute de frappe Document []. Je suis vraiment honteux de celui-là. –

Répondre