Perhaps it\'s too late at night, but I can\'t think of a nice way to do this.
I\'ve started a bunch of asynchronous downloads, and I want to wait until they all comp
I had a similar issue where i needed to reset a server upon some event, but had to wait for all the open requests to finish before killing it.
I used the CountdownEvent class upon server start to initialize it with 1, and inside each request I do:
try
{
counter.AddCount();
//do request stuff
}
finally
{
counter.Signal();
}
And upon receiving the ResetEvent i signal the counter once to eliminate the starting 1, and wait for live requests to signal they are done.
void OnResetEvent()
{
counter.Signal();
counter.Wait();
ResetServer();
//counter.Reset(); //if you want to reset everything again.
}
Basically you initialize the CountdownEvent with one, so that it's in a non signaled state, and with each AddCount call you are increasing the counter, and with each Signal call you are decreasing it, always staying above 1. In your wait thread you first signal it once to decrease the initial 1 value to 0, and if there are no threads running Wail() will immediately stop blocking, but if there are other threads that are still running, the wait thread will wait until they signal. Watch out, once the counter hits 0, all subsequent AddCount calls will throw an exception, you need to Reset the counter first.