【问题标题】:Do Multiple Asyncronous Invocations REQUIRE unique userStates?多个异步调用是否需要唯一的用户状态?
【发布时间】:2011-01-07 16:26:58
【问题描述】:

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

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

Event-based Asynchronous Pattern Overview page on MSDN 上,它说关于 userState:

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

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

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

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

我已经在 google 和 SO 上搜索了几天,但还没有找到答案。

提前致谢

【问题讨论】:

    标签: c# asynchronous delegates callback state


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢! (对如此冗长的问题的如此简洁的回答!)
    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2016-01-11
    • 2010-11-23
    相关资源
    最近更新 更多