2009-08-30 210 views
5

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

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

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

另外,请解释 IAsyncCallbackIAsyncResult接口。 我们如何实现它? (非常简单的例子)

在此先感谢。

回答

13

IAsyncCallback接口不存在,所以你不能实现它。

我怀疑你真的想知道IAsyncResult interface

我建议您在MSDN上阅读this page


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

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

AsyncCallback委托是您提供的方法,将在操作完成时调用。它通常会在不同的线程中调用,所以要小心。您的AsyncCallback方法将获得与之前提供的方法相同的IAsyncResult。状态参数放入IAsyncResult中并被系统忽略;您可以在AsyncCallback方法中使用它来跟踪操作的用途。(该状态可以是你希望它是什么,包括null

里面你的AsyncCallback(或其他地方),你可以调用对应于您在叫BeginWhatever方法EndWhatever方法第一名。您必须从BeginWhatever或从AsyncCallback中为其提供IAsyncResult。当你调用它时,它会等待操作完成(如果尚未完成),然后将操作结果返回给您。 (假设操作返回某些内容;例如,WebRequest.EndGetResponse将返回WebResponse)。如果在操作过程中发生任何错误,EndWhatever将引发异常。


如果您想创建可以在后台运行的自己的操作,那么您将实现IAsyncResult。您还将分别创建BeginWhateverEndWhatever方法返回并将其分别。有关实现IAsyncResult的更多信息,请参阅here

+0

抱歉错别字error.As你说我需要澄清IAsyncResult.Thank很多你的解释。 – user160677 2009-08-30 19:44:09

+2

非常好的解释非常感谢 – user160677 2009-08-30 20:01:39

2

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

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

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

+0

非常感谢你 – user160677 2009-08-30 20:14:35

4

对于同步回调,调用方法(或线程)必须等待被调用方法完成后才能进行处理 - 这很像“普通”方法调用。

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

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

+1

谢谢克里斯的解释 – user160677 2009-08-30 19:49:45

+0

没问题 - 还有很多比它,我会建议阅读更多关于MSDN和在这里搜索有关多线程的问题。 – ChrisF 2009-08-30 19:55:26

+0

当然,我会按照建议通过MSDN。感谢很多 – user160677 2009-08-30 20:05:11