2009-10-14 7 views
1

Je suis un débutant. Basé sur la solution Producer/Consumer d'Albahari, j'ai développé un code. Le codage fonctionne bien. Mais j'ai quelques doutes sur ma mise en œuvre..NET: Demande de clarification -Processing Threads

class FloodDisaterManagement :IDisposable 
    { 

     Queue<string>MedicinePack = new Queue<string>(); 
     Thread[] volunteers; 
     readonly object locker = new object(); 

    public FloodDisaterManagement(int volunteerCount) 
    { 
     volunteers = new Thread[volunteerCount]; 

     for (int i = 0; i < volunteerCount; i++) 
     { 
      volunteers[i] = new Thread(SupplyMedicine); 
      volunteers[i].Start(); 
     } 
    } 

    public void DumpMedicine(string pack) 
    { 
     lock (locker) 
     { 
      MedicinePack.Enqueue(pack); 
      Monitor.PulseAll(locker); 
     } 
    } 

    public void Dispose() 
    { 

     foreach (Thread volunteer in volunteers) DumpMedicine(null); 
     foreach (Thread volunteer in volunteers) volunteer.Join(); 
    } 

    public void SupplyMedicine() 
    { 
     while (true) 
     { 
      string pack; 
      lock (locker) 
      { 
       while (MedicinePack .Count == 0) Monitor.Wait(locker); 
       pack= MedicinePack.Dequeue(); 
      } 
      if (pack == null) return; 
      Console.WriteLine(pack+"is supplied"); 
      Thread.Sleep(1000); 
     } 

    } 


    static void Main() 
    { 
     string[] medicinePacks = new string[] 
     { "Pack1", "Pack2", "Pack3", "Pack4", "Pack5", "Pack6", 
      "Pack7", "Pack8", "Pack9", "Pack10" 
     }; 

     using (FloodDisaterManagement q = new FloodDisaterManagement(2)) 
     { 
      foreach (string pack in medicinePacks) 
       q.DumpMedicine(pack); 
      Console.WriteLine("Enqueued 10 Medicine Packs"); 

     } 

     Console.WriteLine("..Medicines Distribution Completed"); 
     Console.ReadKey(true); 
    } 


} 

Questions:


  1. Comme nous l'avons Utilisation de (...) Main(), pourquoi encore il est nécessaire de Dispose() dans la classe FloodDisasterManagement? Quel est le but exact d'avoir deux foreach dans Dispose()?
  2. D'où vient le retour de contrôle lorsque l'on utilise dans la SupplyMedicine "instruction return"()? (I.e.)
public void SupplyMedicine() 
{ 
    while (true) 
    { 
     .... 
     if (pack == null) return; 
     ... 
     //Whether the control return to Main() or SomeWhere? 
    } 

} 

Répondre

3

1: parce que les usingappels le Dispose(); c'est le but du using. 2: pour fermer chacune des ressources encapsulées, dans ce cas des threads (leur demandant de sortir, puis d'attendre leur sortie).

3: il revient à l'appelant; dans ce cas, l'appelant est un Thread, donc ce sort proprement le fil

Ou en anglais:

  • le usingdans ce cas agit pour attendre que tous les fils de sortie; sans using nous fermer trop tôt
  • les foreach signaux chaque fil pour sortir quand il a terminé le traitement de sa charge, et attend tous
  • le null est détecté comme un signal « sortie maintenant », ce qui provoque chaque fil à sortie
+0

Merci beaucoup Marc. – user186973

1

3:

Puisque la méthode SupplyMedicine fonctionne sur un thread séparé, ce qui est la première et seule méthode gérée par le thread-la déclaration de retour signifie simplement que ce fil a terminé ses travaux et devrait être résilié (ou renvoyé à t Le pool de threads au cas où vous utilisez un thread de pool de threads.

+0

Merci beaucoup – user186973

Questions connexes