WCF框架在以下操作(服务端)实现中对AsyncState和AsyncCallback做了什么?
IAsyncResult BeginWork(<<Service call params>>, AsyncCallback callback, object state);
我想了解
答案 0 :(得分:5)
.NET中有一些用于公开异步方法的设计模式。
使用BeginX
和EndX
方法的此模式称为Asynchronous Programming Model
在此模式中,您始终可以传递这两个额外参数:
1)AsyncCallback callback
是一个委托,在操作完成时被调用。
2)object state
是您要与请求关联的任何对象。
调用者可以提供这两个参数,或者保留null
,具体取决于用例。
请参阅MSDN:Asynchronous Programming Model (APM)
附录:
在异步WCF服务实现的情况下,WCF本身就是“客户端”并填充了两个额外的参数。
这是工作流程:
1)请求来自客户端。
2)WCF构造AsyncCallback
和状态object
3)WCF调用您的BeginX
方法并传递参数
4)在您的方法中,使用WCF的参数构造IAsyncResult
对象
5)您启动一些后台工作并返回IAsyncResult
对象
6)WCF等待调用AsyncCallback
7)WCF调用您的EndX
方法并将响应返回给Web服务客户端。
客户端对此一无所知,可以使用客户端同步或异步调用来调用此Web服务。
答案 1 :(得分:2)
如果您使用WCF开发异步调用,请阅读此内容,非常有用,这是我在此主题上阅读的最佳文章,其中包含良好的示例代码。
http://www.danrigsby.com/blog/index.php/2008/03/26/async-operations-in-wcf-iasyncresult-model-server-side/
编辑:
客户端:
Service.BeginInitialize(data, new AsyncCallback(OnEndInitialize), null);
客户端包含方法:
void OnEndInitialize(IAsyncResult asyncResult)
{
服务将接收“数据”对象,执行它需要的任何操作,然后调用客户端的OnEndInitialize方法。
关于你询问的对象状态,当使用APM模式进行异步操作时,该服务有2个操作,Begin和End,当他启动时,它是BeginOperation,当BeginOperation完成时 - 然后客户端收到IAsyncResult对象,该对象可以包含objectstate。这用于进度指示,我将该对象视为乒乓对象。当服务完成操作时,它在服务端调用EndOperation,这将调用客户端的回调,然后客户端可以再次检查IAsyncResult中的状态对象。
这就是BeginOperation和EndOperation包含IAsyncResult参数/返回的原因。