我是一個初學者。基於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);
}
}
問題:
- 正如我們已經使用(...)在main(),爲什麼仍然有需要的Dispose()在 FloodDisasterManagement類?
- Dispose()中有兩個foreach的確切目的是什麼?
- 哪裏控制返回時,我們使用 「return語句」 的 SupplyMedicine裏面()? (即)
public void SupplyMedicine()
{
while (true)
{
....
if (pack == null) return;
...
//Whether the control return to Main() or SomeWhere?
}
}
非常感謝Marc。 – user186973 2009-10-14 20:34:25