I am a beginner.Based on the Albahari's Producer/Consumer Solution , I have developed a code.Coding is working fine.But I have some doubts on my implementation.
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:
- As We have Using(...) in Main() ,Why still there is a need for Dispose() in FloodDisasterManagement class ?
- What is the exact purpose of having two foreach inside Dispose() ?
- Where does the control return when we use "return statement" inside the SupplyMedicine()? (i.e)
public void SupplyMedicine()
{
while (true)
{
....
if (pack == null) return;
...
//Whether the control return to Main() or SomeWhere?
}
}