2011-01-07 14 views
0

我正在使用委托设置一些异步函数调用的C#应用​​程序。这些调用将受到多次调用的影响,因此我必须使用代理的BeginInvoke方法的重载,该方法需要userState参数;例如: -做多个Asyncronous Invocations需要唯一的用户状态?

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

Event-based Asynchronous Pattern Overview page on MSDN,它说,大约userState:

有可能两个重载 异步操作: 单调用和 多次调用。您可以通过 将这两种形式按其方法签名进行区分 方法签名: 多次调用表单具有一个名为userState的额外 参数。这种形式 可以让您的代码 多次调用Method1Async(字符串参数,对象 userState),而无需 等待任何待执行的异步 操作完成。如果在另一个 手上,您尝试在 先前的调用完成之前调用 Method1Async(字符串参数),则 方法会产生一个 InvalidOperationException。

多调用过载的userState参数允许您使用 区分异步 操作。您提供 每次调用Method1Async(字符串 PARAM,对象userState),以及一个独特的价值 (例如,一个GUID或散列码),当完成 每个操作,您 事件处理程序可确定的这 实例操作引发了 完成事件。

我的问题是:没有了userState是唯一的?措词可以被解释为使其仅仅是一个建议,或者只是与他们的例子有关。我需要将状态传递给回调函数,我不需要它是唯一的。 (我的应用程序不需要跟踪每个单独的调用实例。)因此,唯一性是一项要求吗? (也许是.NET的异步框架需要它?)

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

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

在此先感谢

回答

3

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

它影响EAP,因为通常实施使用AsyncOperationManager.CreateOperation,这需要唯一的用户状态。即使在这种情况下,它通常对最终用户代码通过null用户状态也是有效的;当它调用CreateOperation时,EAP组件将用new object代替它。

+0

非常感谢! (对这样一个冗长的问题的简洁回应!) – paul 2011-01-07 17:05:22