Всегда ли вызовы асинхронных веб-сервисов вызывают AsyncCallback? - PullRequest
1 голос
/ 11 марта 2009

Я выполняю асинхронные вызовы веб-службы из приложения C #:

{
  //Put UI in 'loading' state
  ...

  //Now call web service
  webServiceProxy.BeginMyMethod(param, new AsyncCallback(MyCallback), null);
}


private void MyCallback(IAsyncResult res)
{
   ...
   //process result

   // Put UI back in normal state (yes I'm marshalling back to the UI thread)
}

Основной поток переводит приложение в режим ожидания, а затем в конце функции обратного вызова снова активируются элементы управления. Я вижу ошибку, из-за которой пользовательский интерфейс навсегда застревает в режиме загрузки.

Теперь может быть просто ошибка в коде обратного вызова (там довольно много), но мой вопрос к сообществу таков:

ГАРАНТИРУЕТСЯ ли "MyCallback" вызываться? Предполагая, что «BeginMyMethod» не выдал исключение, могу ли я быть уверен, что MyCallback будет выполнен? Я вижу "CompletedSynchronously" и "IsCompleted" на IAsyncResult, возвращенном функциями BeginXXX, но я не уверен, важно это или нет.

Ответы [ 3 ]

5 голосов
/ 11 марта 2009

Да, обратный вызов гарантированно будет вызван. Обратный вызов - это то, что позволяет асинхронному коду с использованием шаблона Begin* / End* быть написанным в стиле продолжения.

Вы должны вызвать соответствующий метод End* в вашем обратном вызове (обычно это первое, что есть в обратном вызове), однако. Именно так асинхронный метод сообщает об исключении, которое могло произойти во время вызова, с одной стороны, а также о способе получения результата (если есть).

Кодирование асинхронного шаблона с использованием анонимных делегатов при использовании C # 2.0 иногда более элегантно и позволяет записывать продолжение после вызова, близкое к инициации вызова, а также позволяет значительно облегчить обмен данными через захваченные переменные, при условии, что используются соответствующие меры синхронизации.

Ссылка: http://msdn.microsoft.com/en-us/library/ms228972.aspx:

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

  • Используйте делегат AsyncCallback для обработки результатов асинхронной операции в отдельном потоке. Этот подход демонстрируется в этой теме.

[...]

1 голос
/ 11 марта 2009

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

0 голосов
/ 11 марта 2009

Я считаю, что обратный вызов не гарантированно будет вызываться, если свойство CompletedSynchronously имеет значение true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...