同步和异步回调

时间:2009-08-30 19:22:08

标签: c# .net callback iasyncresult

在阅读MSDN文档和代码示例时,我对某些术语感到困惑。

C#中的回调是什么?特别是什么是同步和异步回调?

请从外行人的角度解释这些。

另外,请解释 IAsyncCallback IAsyncResult接口。 我们该如何实施呢? (用非常简单的例子)

提前致谢。

3 个答案:

答案 0 :(得分:14)

IAsyncCallback接口不存在,因此您无法实现它。

我怀疑你确实想知道IAsyncResult interface

我建议您在MSDN上阅读this page


IAsyncResult interface表示在后台运行的操作(例如Web请求或数据库调用),而代码继续执行。它可以告诉您操作是否已完成(IsCompleted属性)。它还为您提供WaitHandle objectAsyncWaitHandle属性),可用于等待操作完成。 (通过致电result.AsyncWaitHandle.WaitOne()

通过调用IAsyncResult Begin 方法获得Whatever。 (BeginExecuteReaderBeginGetResponse和许多其他人)。 Begin Whatever 方法将采用操作所需的任何参数(例如,BeginExecuteReader可以采用CommandBehavior参数),并且可以采取AsyncCallback委托(不是接口)和状态参数。返回一个IAsyncResult对象。

AsyncCallback委托是您提供的方法,将在操作完成时调用。它通常会在不同的线程上调用,所以要小心。您的AsyncCallback方法将获得与Begin Whatever 方法之前提供的相同的IAsyncResult。 state参数被放入IAsyncResult并被系统忽略;您可以在AsyncCallback方法中使用它来跟踪操作的用途。 (州可以是你想要的任何东西,包括null

在AsyncCallback(或其他任何地方)内,您可以调用与End {{1}对应的Whatever Begin 方法你首先调用的方法。您必须从Whatever Begin 或AsyncCallback为其提供IAsyncResult。当你调用它时,它将等待操作完成(如果它还没有完成),然后返回操作的结果。 (假设操作返回一些内容;例如,Whatever将返回WebRequest.EndGetResponse)。如果在操作过程中发生任何错误,WebResponse End 将引发异常。


如果要创建可在后台运行的自己的操作,则应实现IAsyncResult。您还可以创建分别返回并接受它的Whatever Begin Whatever End 方法。有关实现IAsyncResult的更多信息,请参阅here

答案 1 :(得分:5)

使用同步回调,调用方法(或线程)必须等到被调用的方法完成才能进行处理 - 就像“普通”方法调用一样。

使用异步回调,调用方法(或线程)可以继续处理其他输入或事件或其他任何事情,而无需等待被调用的方法完成。

对于应用程序用户界面线程,如果您不希望它在应用程序执行某个冗长的过程时“冻结”,则需要使用异步回调。

答案 2 :(得分:3)

回调只不过是一个委托。使用术语回调是因为您通常将它(委托)传递给方法(作为参数),然后在该方法中调用以发出信号。

同步和异步回调就是这样。同步,在调用方法的同一线程上执行(启动操作)。异步通常在另一个线程上执行(但不总是)

IAsyncCallback接口是用于启动异步任务的模板。传入一个回调(委托),它在工作完成时调用。有一个属性可以确定方法是否同步执行。