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 参数/返回的原因。