Синхронизировать асинхронное
От: Magister Crazy Россия  
Дата: 29.06.10 09:39
Оценка:
Доброго времени суток! Возникла дурацкая проблема, нагуглить решение которой не хватает серого вещества

Есть сторонний класс. У него есть метод LoadData, который что-то там читает, и событие ReadDataEvent, которое возникает по окончанию чтения


{
...
Reader.ReadDataEvent += ReadDataEventHandler;
Reader.LoadData(new TimeInterval(begin, end));
// Вот тут надо дождаться завершения работы обработчика ReadDataEventHandler
...
}

private void ReadDataEventHandler(object rawData, Exception ex, AsyncOperation op)
{
...
}



Проблема в том, что LoadData внутри использует некие асинхронные вызовы в которых собственно и возникает событие, в то же время мне надо обязательно дождаться, когда отработает ReadDataEventHandler.
Понимаю, что вопрос скорее всего элементарный, но что-то
Cogito, ergo sum
Re: Синхронизировать асинхронное
От: TK Лес кывт.рф
Дата: 29.06.10 10:28
Оценка: 2 (1) +2
Здравствуйте, Magister Crazy, Вы писали:

MC>Проблема в том, что LoadData внутри использует некие асинхронные вызовы в которых собственно и возникает событие, в то же время мне надо обязательно дождаться, когда отработает ReadDataEventHandler.

MC>Понимаю, что вопрос скорее всего элементарный, но что-то

Напишите как-то так:

Reader.ReadDataEvent += delegate (object rawData, Exception ex, AsyncOperation op)) 
{ readDataEvent.Set(); 
  readDataEventHandler(rawData, ex, op);
};
Reader.Load();
readDataEvent.WaitOne();
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Синхронизировать асинхронное
От: Magister Crazy Россия  
Дата: 29.06.10 10:41
Оценка:
Здравствуйте, TK, Вы писали:

Эмм... А что такое "readDataEvent"?
Cogito, ergo sum
Re[3]: Синхронизировать асинхронное
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.06.10 10:47
Оценка: 2 (1)
Здравствуйте, Magister Crazy, Вы писали:

MC>Эмм... А что такое "readDataEvent"?


EventWaitHandle
... << RSDN@Home 1.2.0 alpha 4 rev. 1476 on Windows 7 6.1.7600.0>>
AVK Blog
Re: Синхронизировать асинхронное
От: _FRED_ Черногория
Дата: 29.06.10 10:56
Оценка: 2 (1)
Здравствуйте, Magister Crazy, Вы писали:

MC>Проблема в том, что LoadData внутри использует некие асинхронные вызовы в которых собственно и возникает событие, в то же время мне надо обязательно дождаться, когда отработает ReadDataEventHandler.


http://rsdn.ru/forum/dotnet/3859958.aspx
Автор: TK
Дата: 29.06.10
хорошо сказано, только убедитесь, что событие ReadDataEvent возникнет при любом исходе LoadData, например, если даже там возникнет какая-либо ошибка. А то вы не сможете проснуться. Ну и "спать" в WaitOne можно с каким-либо таймаутом.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Синхронизировать асинхронное
От: Magister Crazy Россия  
Дата: 29.06.10 11:11
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Magister Crazy, Вы писали:


Переписал так:


                var resEvent = new EventWaitHandle(false, EventResetMode.ManualReset);
                Reader.ReadDataEvent += delegate(object rawData, Exception ex, AsyncOperation op)
                                        {
                                            resEvent.Set();
                                            ReadDataEventHandler(rawData, ex, op);
                                        };

                Reader.LoadData(LibEx.TimeInterval.CreateInterval(begin, end));
                resEvent.WaitOne();


Теперь навсегда засыпаем в WaitOne
Cogito, ergo sum
Re[3]: Синхронизировать асинхронное
От: Spirit_1 Россия  
Дата: 30.06.10 06:22
Оценка:
Здравствуйте, Magister Crazy, Вы писали:
MC>Переписал так:

MC>
MC>                var resEvent = new EventWaitHandle(false, EventResetMode.ManualReset);
MC>                Reader.ReadDataEvent += delegate(object rawData, Exception ex, AsyncOperation op)
MC>                                        {
MC>                                            resEvent.Set();
MC>                                            ReadDataEventHandler(rawData, ex, op);
MC>                                        };

MC>                Reader.LoadData(LibEx.TimeInterval.CreateInterval(begin, end));
MC>                resEvent.WaitOne();
MC>


MC>Теперь навсегда засыпаем в WaitOne


А событие точно вызывается?
Re: Синхронизировать асинхронное
От: Magister Crazy Россия  
Дата: 30.06.10 08:17
Оценка:
Еще раз всем спасибо! Извернулся вынесением LoadData() в отдельный поток. Так все заработало нормально.
Cogito, ergo sum
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.