我正在开发一个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几天,还没有找到答案。
提前致谢
答案 0 :(得分:3)
它不适用于您的情况。 Begin
/ End
是IAsyncResult
异步模式,而不是基于事件的异步模式(EAP)。
它影响EAP,因为通常实现使用AsyncOperationManager.CreateOperation
,这需要唯一的用户状态。即使在这种情况下,它(通常)对最终用户代码有效,也可以传递null
用户状态;当调用new object
时,EAP组件会用CreateOperation
替换它。