Вы уже видели CountdownEvent в .Net 4? Это сигнальная конструкция, в которой один поток заблокируется и продолжит работу только после того, как другие потоки завершили и вызвали set для события обратного отсчета. Вы инициализируете его числом сигналов, которое вам нужно, прежде чем поток, вызывающий Wait
для конструкции, продолжит работу. E.g.:
CountdownEvent countdown = new CountdownEvent(3);
позволит потоку, вызывающему Wait
, продолжить, только если 3 других потока вызвали Signal
.
Итак, ваш пример может выглядеть примерно так:
public void lotsOfAsync()
{
Int32 numberOfAsyncProcesses = Async1List.Length + 1;
CountdownEvent countdown = new CountdownEvent (numberOfAsyncProcesses);
DoAsync1(countdown); // call countdown.signal() in the async method once complete.
for each ( MyClass in Async1List)
{
// call countdown.signal() in the async method once complete.
MyClass.DoAsyn2(countdown);
}
if(countDown.Wait(TimeSpan.FromSeconds(3))
{
FinalAction();
}
}
Я также добавил время ожидания, когда вызывающий поток разблокируется через 3 секунды, если не получит ответ от всех потоков обработки. В этом случае последнее действие не будет выполнено.
Вы можете воспроизвести это с помощью Monitor / Pulse, если вы не нацеливаетесь на .Net 4.
Вот хороший пример и здесь . Надеюсь, это поможет!