WCF 框架在下面的操作(服务端)实现中对 AsyncState 和 AsyncCallback 做了什么?
IAsyncResult BeginWork(<<Service call params>>, AsyncCallback callback, object state);
我试图理解
- 谁在填充这些?
- 他们的目的是什么?
- 与(2)相关,使用这些的最佳实践是什么?
.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) 在您的方法中,您IAsyncResult
使用 WCF 的参数构造一个对象
5) 您启动一些后台工作并返回您的IAsyncResult
对象
6) WCF 等待它AsyncCallback
的调用
7) WCF 调用您的EndX
方法并将响应返回给 Web 服务客户端。
客户端对此一无所知,可以使用客户端同步或异步调用来调用此 Web 服务。
如果您使用 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 对象,即对象可以包含对象状态。这用于进度指示,我会将对象视为乒乓对象。当服务完成操作时,它会在服务端调用 EndOperation,这会在客户端调用回调,然后客户端可以再次检查 IAsyncResult 中的状态对象。
这就是 BeginOperation 和 EndOperation 包含 IAsyncResult 参数/返回的原因。