Здравствуйте, Аноним, Вы писали:
На всякий случай пример
здесьАвтор: Andrey-D
Дата: 13.04.12
А>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, Аноним, Вы писали:
А>>>Есть рабочее решение для SL связанное с использованием ManualResetEvent.
А>>>Для вас все еще актуально?
А>>Для WP7? Актуально конечно.
А>Для WP7 не пробовал, поэтому ничего не обещаю, но там должен быть точно такой же SL с одним UI-потоком.
А>Но, в SL та же проблема с цепочками асинхронных вызовов и зависанием главного потока при попытке сделать EventWaitHandle.WaitOne().
А>Это происходит потому, что мы вызовом WaitOne заставляем ждать главный поток события завершения другого потока, а продолжиться после установки Set он уже не может. Происходит deadlock. На форумах (в том числе англоязычных) рекомендуют не использовать Manual/AutoResetEvent'ы и менять образ мышления на асинхронный. Но разработчики все равно часто задают вопросы о том как избавиться от async лапши в коде.
А>Проблема с зависанием EventWaitHandle.WaitOne() решается тем, что мы делаем его не в UI-потоке, а в фоновом потоке (с помощью ThreadPool.QueueUserWorkItem, например).
А>При этом мы не уходим от асинхронности, т.к. нам нужно подписаться на событие завершения кода в фоновом потоке, но при этом вынесенный код можно синхронизировать с помощью сигналов (EventWaitHandle) и имитировать синхронность.