2009-10-14 101 views
1

我是一个初学者。基于Albahari的生产者/消费者解决方案,我开发了一个代码。编码工作正常。但我对我的实现有一些怀疑。.NET:澄清请求 - 处理线程

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); 
    } 


} 

问题:


  1. 正如我们已经使用(...)在main(),为什么仍然有需要的Dispose()在 FloodDisasterManagement类?
  2. Dispose()中有两个foreach的确切目的是什么?
  3. 哪里控制返回时,我们使用 “return语句” 的 SupplyMedicine里面()? (即)
public void SupplyMedicine() 
{ 
    while (true) 
    { 
     .... 
     if (pack == null) return; 
     ... 
     //Whether the control return to Main() or SomeWhere? 
    } 

} 

回答

3

1:因为using呼叫Dispose();这就是using的目的。 2:关闭每个封装的资源,在这种情况下,线程(要求它们退出,然后等待它们退出)。

3:它返回给调用者;在这种情况下,调用者是Thread,所以这完全退出线程

或英文:

  • using在这种情况下行为,等待所有线程退出;没有using我们将关闭太早
  • foreach信号,每个线程退出时,它已经处理完其负载,并等待他们全部
  • null被检测为“立即退出”信号,导致每个线程出口
+0

非常感谢Marc。 – user186973 2009-10-14 20:34:25

1

约为3:

由于SupplyMedicine方法在一个单独的线程中运行,这是运行第一个也是唯一方法thread- return语句只是意味着该线程完成其工作,并应被终止(或返回到t如果你正在使用线程池线程,他会使用线程池)。

+0

非常感谢 – user186973 2009-10-14 20:35:07