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
Well... you can snatch all the semaphore counters on the main thread back in order to blocks when count is 0, rather than non-zero.
REVISED: Here I assumed 3 things:
So here's my solution, revised:
Initializes the Semaphore with a large enough counter so you never hit the maximum (it could be simply 100 or just 10 depending on your situation):
var maxDownloads = 1000;
_semaphore = new Semaphore(0, maxDownloads);
Then on each downloads, begins with WaitOne() before starting the download so that in the event of program exiting, no downloads can start.
if (_semaphore.WaitOne())
/* proceeds with downloads */
else
/* we're terminating */
Then on download completion, release one counter (if we had acquired one):
finally { _semaphore.Release(1); }
And then on the "Exit" event, consume up all the counters on the Semaphore:
for (var i = 0; i < maxDownloads; i++)
_semaphore.WaitOne();
// all downloads are finished by this point.
...