在阅读 MSDN 文档和代码示例时,我对某些术语感到困惑。
C# 中的回调是什么?特别是,什么是同步和异步回调?
请从外行的角度解释这些。
另外,请解释一下IAsyncCallback IAsyncResult
接口。我们如何实现它?(有一个非常简单的例子)
提前致谢。
在阅读 MSDN 文档和代码示例时,我对某些术语感到困惑。
C# 中的回调是什么?特别是,什么是同步和异步回调?
请从外行的角度解释这些。
另外,请解释一下IAsyncCallback IAsyncResult
接口。我们如何实现它?(有一个非常简单的例子)
提前致谢。
该IAsyncCallback
接口不存在,因此您无法实现它。
我怀疑您实际上想了解IAsyncResult
界面。
我建议您阅读MSDN 上的此页面。
该IAsyncResult
接口表示在后台运行的操作(例如 Web 请求或数据库调用),而您的代码继续执行。它可以告诉你操作是否完成(IsCompleted
属性)。它还为您提供了一个WaitHandle
对象(AsyncWaitHandle
属性),可用于等待操作完成。(通过调用result.AsyncWaitHandle.WaitOne()
)
你IAsyncResult
通过调用一个Begin
Whatever
方法得到一个。( BeginExecuteReader
, BeginGetResponse
, 和许多其他的)。该Begin
Whatever
方法将采用操作所需的任何参数(例如,BeginExecuteReader
可以采用CommandBehavior
参数),并且可以采用 AsyncCallback 委托(不是接口)和状态参数。In 返回一个IAsyncResult
对象。
AsyncCallback 委托是您提供的一种方法,将在操作完成时调用该方法。它通常会在不同的线程上调用,所以要小心。您的 AsyncCallback 方法将获得与该Begin
Whatever
方法之前为您提供的相同的 IAsyncResult。state 参数放入 IAsyncResult 并被系统忽略;您可以在 AsyncCallback 方法中使用它来跟踪操作的用途。(状态可以是您想要的任何状态,包括null
)
在您的 AsyncCallback(或其他任何地方)内,您可以调用与您首先调用的End
Whatever
方法相对应的Begin
Whatever
方法。您必须给它来自Begin
Whatever
或来自 AsyncCallback 的 IAsyncResult。当您调用它时,它将等待操作完成(如果尚未完成),然后将操作结果返回给您。(假设操作返回一些东西;例如,WebRequest.EndGetResponse
将返回 a WebResponse
)。如果在操作过程中发生任何错误,End
Whatever
都会抛出异常。
如果您想创建自己的可以在后台运行的操作,您将实现 IAsyncResult。您还将分别创建返回和获取它的Begin
Whatever
和方法。End
Whatever
有关实现 IAsyncResult 的更多信息,请参见此处。
使用同步回调,调用方法(或线程)必须等到被调用方法完成才能继续处理 - 很像“普通”方法调用。
使用异步回调,调用方法(或线程)可以继续处理其他输入或事件或任何其他内容,而无需等待被调用方法完成。
对于应用程序用户界面线程,如果您不希望它在应用程序执行一些冗长的过程时“冻结”,您需要使用异步回调。
回调只不过是一个委托。使用术语回调是因为您通常将它(委托)传递给方法(作为参数),然后在该方法中调用以发出信号。
同步和异步回调就是这样。同步的,在调用该方法(启动操作)的同一线程上执行。异步通常在另一个线程上执行(但并非总是如此)
IAsyncCallback 接口是启动异步任务的模板。您传入一个回调(委托),该回调(委托)在工作完成时被调用。有一个属性可以确定方法是否同步执行。