Как дождаться завершения асинхронного вызова? - PullRequest
2 голосов
/ 24 ноября 2011

Предположим, у меня есть два события A и B. Каждое из них вызывает асинхронный вызов, скажем, AsyncA и AsyncB.

То, что я хочу, это: когда A будет вызывать AsyncA, только когда AsyncB завершен.

События A и B срабатывают по порядку: A, затем B. Я ожидаю, что AsyncA завершена до завершения AsyncB, но на самом деле, в большинстве случаев AsyncB завершается до AsyncA.

Я не могу поместить вызов AsyncB в завершенное событие AsyncA. Как убедиться, что AsyncB всегда после AsyncA?

Ответы [ 3 ]

0 голосов
/ 24 ноября 2011

Поскольку оба вызова выполняются асинхронно, вы не можете контролировать их порядок. Это делается планировщиком.

Но вы можете использовать TPL для синхронной работы обоих:

System.Threading.Tasks.Task.Factory.StartNew( ( ) => OnAsyncA() )
    .ContinueWith( ( t ) => OnAsyncB() );
0 голосов
/ 24 ноября 2011

Вы не можете гарантировать порядок завершения асинхронных вызовов, но вы можете выполнить работу , которую вы хотите выполнить, в нужном вам порядке.Вам нужен способ синхронизации.

В OnAsyncA вам необходимо:

  1. Выполнить необходимую работу и, при необходимости, сохранить информацию, необходимую для OnAsyncB.
  2. Установка дескриптора ожидания (например, ManualResetEvent или AutoResetEvent ).

In OnAsyncB,

  1. Сохраните любую необходимую информацию (например, результаты).
  2. Создайте поток пула потоков .(Ожидание сигнала в обработчике было бы плохой идеей, поскольку обратный вызов WCF происходит в потоке пользовательского интерфейса).

В потоке потоков

  1. Ожидание в дескрипторе.
  2. Выполните ту работу, которую вы обычно выполняли бы для OnAsyncB.

. Существуют и другие варианты, такие как более длительное выполнение потока, исключающего очередь из «зависимых событий».очередь с использованием TPL и т. д.

Не забудьте выполнить синхронизацию обратно с потоком пользовательского интерфейса из потока пула потоков.

0 голосов
/ 24 ноября 2011

Если важен порядок, то вызовы асинхронных методов не подходят.

...