Синхронные и асинхронные обратные вызовы - PullRequest
6 голосов
/ 30 августа 2009

Я путаюсь с некоторыми терминами при чтении документов MSDN и примеров кода.

Что такое обратные вызовы в C #? В частности, что такое синхронные и асинхронные обратные вызовы?

Пожалуйста, объясните это с точки зрения непрофессионала.

Также, пожалуйста, объясните интерфейс IAsyncCallback IAsyncResult. Как мы можем это реализовать? (с очень простым примером)

Заранее спасибо.

Ответы [ 3 ]

14 голосов
/ 30 августа 2009

Интерфейс IAsyncCallback не существует, поэтому вы не можете его реализовать.

Я подозреваю, что вы действительно хотите знать об интерфейсе IAsyncResult .

Я рекомендую вам прочитать эту страницу в MSDN.


Интерфейс IAsyncResult представляет операцию (такую ​​как веб-запрос или вызов базы данных), которая выполняется в фоновом режиме, пока ваш код продолжает выполняться. Он может сообщить вам, завершена ли операция (свойство IsCompleted). Он также дает вам WaitHandle объект (свойство AsyncWaitHandle), который можно использовать для ожидания завершения операции. (По телефону result.AsyncWaitHandle.WaitOne())

Вы получаете IAsyncResult, вызывая метод BeginWhatever. (BeginExecuteReader, BeginGetResponse и многие другие). Метод BeginWhatever принимает любые параметры, необходимые для операции (например, BeginExecuteReader может принимать параметр CommandBehavior), и может принимать делегат AsyncCallback (не интерфейс) и параметр состояния. In возвращает IAsyncResult объект.

Делегат AsyncCallback - это предоставленный вами метод, который будет вызываться после завершения операции. Обычно он вызывается в другом потоке, поэтому будьте осторожны с ним. Ваш метод AsyncCallback получит тот же IAsyncResult, что метод BeginWhatever дал вам ранее. Параметр состояния помещается в IAsyncResult и игнорируется системой; Вы можете использовать его в своем методе AsyncCallback, чтобы отслеживать, для чего предназначалась операция. (Состояние может быть любым, каким вы хотите, включая null)

Внутри вашего AsyncCallback (или где-либо еще) вы можете вызвать метод EndWhatever, который соответствует методу BeginWhatever, который вы вызвали в первое место. Вы должны дать ему IAsyncResult от BeginWhatever или от AsyncCallback. Когда вы вызываете его, он будет ждать завершения операции (если она еще не завершена), а затем вернет вам результат операции. (Предполагая, что операция что-то возвращает; например, WebRequest.EndGetResponse вернет WebResponse). Если во время операции произошла ошибка, EndWhatever сгенерирует исключение.


Вы бы реализовали IAsyncResult, если хотите создать собственную операцию, которая может выполняться в фоновом режиме. Вы также должны создать BeginWhatever и EndWhatever методы, которые возвращают и принимают его соответственно. Для получения дополнительной информации о реализации IAsyncResult см. здесь .

5 голосов
/ 30 августа 2009

При синхронном обратном вызове вызывающий метод (или поток) должен ждать, пока вызванный метод не завершится, прежде чем он сможет продолжить обработку - во многом как «обычный» вызов метода.

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

Для потока пользовательского интерфейса приложения, если вы не хотите, чтобы он «завис», пока приложение выполняет какой-то длительный процесс, вам необходимо использовать асинхронные обратные вызовы.

3 голосов
/ 30 августа 2009

Обратный вызов - не более чем делегат. Термин обратный вызов используется потому, что вы обычно передаете его (делегат) в метод (в качестве аргумента), а затем вызывается в этом методе, чтобы что-то сигнализировать.

Таковы обратные вызовы Sync и Async. Синхронный, выполняется в том же потоке, который вызвал метод (запустил действие). Асинхронное выполнение обычно выполняется в другом потоке (но не всегда)

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

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