【问题标题】:Call signature of Func<TResult>.BeginInvokeFunc<TResult>.BeginInvoke 的调用签名
【发布时间】:2015-08-08 05:33:19
【问题描述】:

我正在尝试使用 C# 和 .net 4.5/4.6 编写异步操作,并尝试使用 Func.BeginInvoke()

这是 MSDN 的 BeginInvoke 页面所说的:

public virtual IAsyncResult BeginInvoke(
    AsyncCallback callback,
    Object object
)

不幸的是,没有关于第二个参数(对象)是什么的信息,主要的MSDN Async Tutorial Page 显示:

// Initiate the asychronous call.
        IAsyncResult result = caller.BeginInvoke(3000, 
            out threadId, null, null);

这甚至不是受支持的函数定义!

看起来 .net 文档自我上次查看以来已经变得更糟了。

我们将不胜感激!

【问题讨论】:

  • 您应该考虑在 .net 4.5 中使用 TPLasync/await 功能进行异步调用。 IAsyncResult 使用和理解起来比较复杂,也比较陈旧。
  • 谢谢您,您的建议比实际答案更好:)
  • 啊,我需要让同步代码异步,所以我仍然需要“旧的slog”方式,但会使用async/await来调用它。
  • 好吧,这对 UI 来说是合理的。你可以这样使用它:var result = await Task.Run(() =&gt; comComponent.SomeAction())
  • Task.Run 只是在.net 4.5.1 中为Task.Factory.StartNew 添加的一个有用的快捷方式,具有足够的默认参数。

标签: c# .net asynchronous


【解决方案1】:

AsyncCallback 委托的签名等同于Action&lt;object&gt;BeginInvoke 的第二个参数将作为参数提供给您的回调 - 要传递的一些状态。

如果你的委托有一些参数,它们也应该传递给异步调用。所以BeginInvoke 对不同类型的委托会有不同的签名。

在教程中使用了这个:

public delegate string AsyncMethodCaller(int callDuration, out int threadId);

所以在调用中

IAsyncResult result = caller.BeginInvoke(3000, out threadId, null, null);

3000callDuration 的值,out threadId 用于out int threadId,而nullnullcallbackobject

【讨论】:

    【解决方案2】:

    就在您链接到的页面Calling Synchronous Methods Asynchronously

    第二个参数是用户自定义对象,将信息传递给回调方法。

    它通过IAsyncResult 参数的AsyncState 属性到达。

    每个委托类型的 BeginInvoke 方法签名都不同。语言运行时保证它使用与委托类型相同的参数以及它在您链接到的第二页上讨论的两个附加参数来定义。您已链接到不带参数的 Func&lt;T&gt; 的文档,但该示例使用具有两个参数的自定义委托类型,因此签名不同。

    【讨论】:

      【解决方案3】:

      在 BeginInvoke 对象中是您传递给回调的参数。它将作为回调参数中的属性提供。我通常传递委托本身,所以我在它上面调用 EndInvoke。

      【讨论】:

      • 根据我的经验,传递给回调的IAsyncResult参数始终是AsyncResult的一个实例,它暴露了一个属性AsyncDelegate,所以不需要直接传递委托。有关示例,请参见 this answer
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多