3

WCF 框架在下面的操作(服务端)实现中对 AsyncState 和 AsyncCallback 做了什么?

IAsyncResult BeginWork(<<Service call params>>, AsyncCallback callback, object state);

我试图理解

  1. 谁在填充这些?
  2. 他们的目的是什么?
  3. 与(2)相关,使用这些的最佳实践是什么?
4

2 回答 2

5

.NET 中有几种设计模式用于公开异步方法。

这种带有BeginXEndX方法的模式称为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 服务。

于 2013-04-02T07:43:12.733 回答
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 对象,即对象可以包含对象状态。这用于进度指示,我会将对象视为乒乓对象。当服务完成操作时,它会在服务端调用 EndOperation,这会在客户端调用回调,然后客户端可以再次检查 IAsyncResult 中的状态对象。
这就是 BeginOperation 和 EndOperation 包含 IAsyncResult 参数/返回的原因。

于 2013-04-02T14:41:14.920 回答