Вы можете сделать это с двумя ManualResetEvent
объектами. Идея состоит в том, чтобы основной поток инициализировал оба как unsignaled, а затем вызывал асинхронные методы. Затем основной поток выполняет WaitAny
для обоих объектов. Когда AsynchronousCall1
завершается, он сигнализирует об одном из объектов. Когда AsynchronousCall2
завершается, он сигнализирует другому. Вот код:
ManualResetEvent Event1 = new ManualResetEvent(false);
ManualResetEvent Event2 = new ManualResetEvent(false);
void SomeMethod()
{
WaitHandle[] handles = {Event1, Event2};
AsynchronousCall1();
AsynchronousCall2();
int index = WaitHandle.WaitAny(handles);
// if index == 0, then Event1 was signaled.
// if index == 1, then Event2 was signaled.
}
void AsyncProc1()
{
// does its thing and then
Event1.Signal();
}
void AsyncProc2()
{
// does its thing and then
Event2.Signal();
}
Здесь есть несколько предостережений. Если оба асинхронных метода заканчивают работу до вызова WaitAny
, невозможно сказать, какой из них завершился первым. Кроме того, если оба метода завершаются очень близко друг к другу (т.е. вызов 1 завершается, то вызов 2 завершается до освобождения ожидания основного потока), невозможно сказать, какой из них завершился первым.