多个异步调用是否需要唯一的用户状态?

时间:2011-01-07 16:26:59

标签: c# asynchronous delegates callback state

我正在开发一个C#应用程序,在其中我使用委托设置了一些异步函数调用。这些调用将受到多次调用,因此我必须使用委托的BeginInvoke方法的重载,该方法采用userState参数; e.g:

callerDelegate.BeginInvoke([fn_args...], callback, userState)

Event-based Asynchronous Pattern Overview page on MSDN上,它说的是userState:

  

可能有两个重载   对于异步操作:   单一调用和   多调用。您可以   通过他们区分这两种形式   方法签名:   多重调用表单有一个额外的   参数叫做userState。这个表格   使您的代码成为可能   调用Method1Async(字符串参数,对象   userState)多次没有   等待任何挂起的异步   完成的操作。如果,另一方面   手,你试着打电话   方法1之前的异步(字符串参数)   以前的调用已经完成了   方法提出了一个   InvalidOperationException异常。

     

的userState参数   多重调用重载允许   你要区分异步   操作。您提供了独特的价值   (例如,GUID或哈希码)   每次调用Method1Async(string   param,object userState),以及何时   每个操作都完成了,你的   事件处理程序可以确定哪个   操作的实例提出了   完成活动。

我的问题是: userState 是否具有唯一性?措辞可以被解释为使其仅仅是推荐,或者仅仅与他们的示例相关。我确实需要将状态传递给回调,我只是不需要它是唯一的。 (我的应用程序不需要跟踪每个单独的调用实例。)那么,唯一性是一个要求吗? (也许.NET的异步框架需要它吗?)

此外,引用的页面用于基于事件的异步操作;这适用于我的情况(使用委托的异步调用)吗?

我已经搜索了谷歌和SO几天,还没有找到答案。

提前致谢

1 个答案:

答案 0 :(得分:3)

它不适用于您的情况。 Begin / EndIAsyncResult异步模式,而不是基于事件的异步模式(EAP)。

它影响EAP,因为通常实现使用AsyncOperationManager.CreateOperation,这需要唯一的用户状态。即使在这种情况下,它(通常)对最终用户代码有效,也可以传递null用户状态;当调用new object时,EAP组件会用CreateOperation替换它。