同步和异步回调

use*_*677 6 .net c# callback iasyncresult

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

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

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

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

提前致谢.

SLa*_*aks 14

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

我怀疑你真的想知道IAsyncResult界面.

我建议您在MSDN上阅读此页面.


IAsyncResult接口表示的操作(例如,web请求或数据库呼叫),其在后台运行,同时您的代码继续执行.它可以告诉你操作是否完成(IsCompleted属性).它还为您提供了一个WaitHandle对象(AsyncWaitHandle属性),可用于等待操作完成.(通过电话result.AsyncWaitHandle.WaitOne())

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

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

在AsyncCallback(或其他任何地方)中,您可以调用与您首先调用的EndWhatever方法相对应的BeginWhatever方法.您必须BeginWhatever从AsyncCallback或从AsyncCallback 向它提供IAsyncResult .当你调用它时,它将等待操作完成(如果它还没有完成),然后返回操作的结果.(假设操作返回一些东西;例如,WebRequest.EndGetResponse将返回a WebResponse).如果在操作期间发生任何错误,EndWhatever将抛出异常.


如果要创建可在后台运行的自己的操作,则可以实现IAsyncResult.您还将分别创建BeginWhateverEndWhatever返回并接受它的方法.有关实现IAsyncResult的更多信息,请参见此处.

  • 非常好的解释非常感谢你 (2认同)

Chr*_*isF 5

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

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

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