在阅读MSDN文档和代码示例时,我对某些术语感到困惑。
C#中的回调是什么?特别是什么是同步和异步回调?
请从外行人的角度解释这些。
另外,请解释 IAsyncCallback IAsyncResult
接口。
我们该如何实施呢? (用非常简单的例子)
提前致谢。
答案 0 :(得分:14)
IAsyncCallback
接口不存在,因此您无法实现它。
我怀疑你确实想知道IAsyncResult
interface。
我建议您在MSDN上阅读this page。
IAsyncResult
interface表示在后台运行的操作(例如Web请求或数据库调用),而代码继续执行。它可以告诉您操作是否已完成(IsCompleted
属性)。它还为您提供WaitHandle
object(AsyncWaitHandle
属性),可用于等待操作完成。 (通过致电result.AsyncWaitHandle.WaitOne()
)
通过调用IAsyncResult
Begin
方法获得Whatever
。 (BeginExecuteReader
,BeginGetResponse
和许多其他人)。 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接口是用于启动异步任务的模板。传入一个回调(委托),它在工作完成时调用。有一个属性可以确定方法是否同步执行。