在阅读MSDN文档和代码示例时,我对某些术语感到困惑。同步和异步回调
什么是C#中的回调?特别是,什么是同步和异步回调?
请从外行人的角度解释这些。
另外,请解释 IAsyncCallbackIAsyncResult
接口。 我们如何实现它? (非常简单的例子)
在此先感谢。
在阅读MSDN文档和代码示例时,我对某些术语感到困惑。同步和异步回调
什么是C#中的回调?特别是,什么是同步和异步回调?
请从外行人的角度解释这些。
另外,请解释 IAsyncCallbackIAsyncResult
接口。 我们如何实现它? (非常简单的例子)
在此先感谢。
IAsyncCallback
接口不存在,所以你不能实现它。
我怀疑你真的想知道IAsyncResult
interface。
我建议您在MSDN上阅读this page。
的IAsyncResult
interface表示的操作(例如,web请求或数据库呼叫),其在后台运行,同时您的代码继续执行。它可以告诉你操作是否完成(IsCompleted
属性)。它还为您提供了一个WaitHandle
object(AsyncWaitHandle
属性),可用于等待操作完成。 (通过调用result.AsyncWaitHandle.WaitOne()
)
您可以通过调用一个Begin
Whatever
方法得到IAsyncResult
。 (BeginExecuteReader
,BeginGetResponse
,和许多其他)。 Begin
Whatever
方法将采取该操作所需的任何参数(例如,BeginExecuteReader
可以采用CommandBehavior
参数),并且可以采用AsyncCallback委托(而非接口)和状态参数。在返回一个IAsyncResult
对象。
AsyncCallback委托是您提供的方法,将在操作完成时调用。它通常会在不同的线程中调用,所以要小心。您的AsyncCallback方法将获得与之前提供的方法相同的IAsyncResult。状态参数放入IAsyncResult中并被系统忽略;您可以在AsyncCallback方法中使用它来跟踪操作的用途。(该状态可以是你希望它是什么,包括null
)
里面你的AsyncCallback(或其他地方),你可以调用对应于您在叫Begin
Whatever
方法End
Whatever
方法第一名。您必须从Begin
Whatever
或从AsyncCallback中为其提供IAsyncResult。当你调用它时,它会等待操作完成(如果尚未完成),然后将操作结果返回给您。 (假设操作返回某些内容;例如,WebRequest.EndGetResponse
将返回WebResponse
)。如果在操作过程中发生任何错误,End
Whatever
将引发异常。
如果您想创建可以在后台运行的自己的操作,那么您将实现IAsyncResult。您还将分别创建Begin
Whatever
和End
Whatever
方法返回并将其分别。有关实现IAsyncResult的更多信息,请参阅here。
回调只不过是一个代表。使用术语回调函数是因为您通常将它(委托)传递给方法(作为参数),然后在该方法中调用以表示某种信号。
同步和异步回调是。同步,在调用方法的同一个线程上执行(启动操作)。异步通常在另一个线程上执行(但不总是)
IAsyncCallback接口是一个用于启动异步任务的模板。你传入一个回调(委托),当工作完成时调用它。有一个属性可以确定该方法是否同步执行。
非常感谢你 – user160677 2009-08-30 20:14:35
对于同步回调,调用方法(或线程)必须等待被调用方法完成后才能进行处理 - 这很像“普通”方法调用。
使用异步回调,调用方法(或线程)可以继续处理其他输入或事件或任何其他内容,而无需等待被调用的方法完成。
对于应用程序用户界面线程,如果您不希望它在应用程序执行一些冗长的过程时“冻结”,则需要使用异步回调。
谢谢克里斯的解释 – user160677 2009-08-30 19:49:45
没问题 - 还有很多比它,我会建议阅读更多关于MSDN和在这里搜索有关多线程的问题。 – ChrisF 2009-08-30 19:55:26
当然,我会按照建议通过MSDN。感谢很多 – user160677 2009-08-30 20:05:11
抱歉错别字error.As你说我需要澄清IAsyncResult.Thank很多你的解释。 – user160677 2009-08-30 19:44:09
非常好的解释非常感谢 – user160677 2009-08-30 20:01:39