【问题标题】:Waiting till an asynchrous method completes. (Function returning IAsyncResult )等待异步方法完成。 (返回 IAsyncResult 的函数)
【发布时间】:2013-07-02 10:26:24
【问题描述】:

我有一个网络服务和这个特殊的功能:

IAsyncResult func(object signature, AsyncCallback callBack, object asyncState)

我可以理解,使用 await 的唯一目的不是在执行很长的操作时阻塞 UI 它还有一些回调函数,可以用来执行“func”的结果

在我的情况下,我必须等待(必须等待)直到我得到 func 的结果。

任何建议我应该如何等到我得到 func 的结果(换句话说,等我得到结果)

编辑:

我为什么要这样做?

我只想检查签名是否属于特定类型。如果是,则函数停止执行并返回 0。 这是我从 func 中需要的唯一功能,并且认为不值得定义回调方法和状态对象。

【问题讨论】:

  • 我应该使用 WaitOne 吗?
  • 您无需等待。在某些情况下,似乎您必须等待。描述您的情况,我们将帮助您找到等待的替代方法。

标签: c# visual-studio-2010 .net-4.0 .net-4.5 async-await


【解决方案1】:

您所描述的是异步编程模型,它早于任务,并在 .NET 中广泛使用,直到 v. 3.5。这是所有 BeginXXX/EndXXX 方法对使用的模型。

您可以使用FromAsync 方法convert APM calls to TPL 任务。以下示例来自文档,并从 FileStream BeginRead 和 EndRead 方法创建一个任务。

BeginRead 有一个类似于 func 的签名:

 IAsyncResult BeginRead(byte[] array,int offset,
    int numBytes,
    AsyncCallback userCallback,
    Object stateObject)

您可以将其转换为这样的任务:

Task<int> task = Task<int>.Factory.FromAsync(
        fs.BeginRead, fs.EndRead, data, 0, data.Length, null);

一旦你有了任务,你就可以等待它:

var bytes = await Task<int>.Factory.FromAsync(
        fs.BeginRead, fs.EndRead, data, 0, data.Length, null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多