6

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

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

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

另外,请解释一下IAsyncCallback IAsyncResult接口。我们如何实现它?(有一个非常简单的例子)

提前致谢。

4

3 回答 3

14

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

我怀疑您实际上想了解IAsyncResult界面

我建议您阅读MSDN 上的此页面


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

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

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

在您的 AsyncCallback(或其他任何地方)内,您可以调用与您首先调用的EndWhatever方法相对应的BeginWhatever方法。您必须给它来自BeginWhatever或来自 AsyncCallback 的 IAsyncResult。当您调用它时,它将等待操作完成(如果尚未完成),然后将操作结果返回给您。(假设操作返回一些东西;例如,WebRequest.EndGetResponse将返回 a WebResponse)。如果在操作过程中发生任何错误,EndWhatever都会抛出异常。


如果您想创建自己的可以在后台运行的操作,您将实现 IAsyncResult。您还将分别创建返回和获取它的BeginWhatever和方法。EndWhatever有关实现 IAsyncResult 的更多信息,请参见此处

于 2009-08-30T19:40:37.330 回答
5

使用同步回调,调用方法(或线程)必须等到被调用方法完成才能继续处理 - 很像“普通”方法调用。

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

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

于 2009-08-30T19:47:10.640 回答
3

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

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

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

于 2009-08-30T19:26:40.057 回答