【发布时间】: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