【问题标题】:Multiple calls wait on the same async task多个调用等待同一个异步任务
【发布时间】:2012-09-17 22:23:10
【问题描述】:

基本上,我的应用中有很多地方要执行某些操作,我需要确保下载了产品图片。我想把这个调用集中到一个地方,所以我确保只下载一次。我想在我的课堂上这样做:

private IAsyncOperation<bool> _downloadCoverTask;

internal IAsyncOperation<bool> DownloadCoverAsync()
{
    if (this._downloadCoverTask == null)
    {
        this._downloadCoverTask = this._cloudProduct.Image.DownloadAsync();
    }

    return this._downloadCoverTask;
}

_cloudProduct.Image.DownloadAsync() 是一种实际下载图像的方法(它也恰好位于我无法控制的库中)。

所以在我需要下载图像的代码中,我这样做了

await product.DownloadCoverAsync();
// do stuff with the image

我第一次调用它时可以正常工作,但第二次调用它时出现异常“在不允许时分配了一个委托”。我也没有得到任何堆栈跟踪或任何东西。

这会被称为一堆地方,但我希望他们都会等待同一个任务,然后在完成后继续。如果它已经完成,我希望它会立即返回。可能是我理解错了,这不是它的工作原理?

(是的,我发布了这个before,但无法得到答案,我认为这个问题更好地总结了这个问题。还有this question,但它使用了TPL,似乎还有更多复杂的目标。)

【问题讨论】:

  • 对于Task&lt;T&gt;,我相信你会没事的......看起来这是一个特定于 WinRT 的问题 :(
  • 我正要发布与您的其他问题相同的答案。你能描述一下为什么它不起作用吗?
  • 为了后代 - 这个错误也可以显示的一个地方是,在 C++ 中,您在一个 IAsyncOperation 上调用 create_task 两次。缓存任务也比 C++ 中的 IAsyncOperations 更好。
  • 当 co_await'ing 两次相同的异步操作时,这也会在 C++/WinRT 中发生。不幸的是,这里没有一个简单的解决方法:(

标签: c# asynchronous windows-runtime task .net-4.5


【解决方案1】:

尝试使用Task&lt;bool&gt; 而不是IAsyncOperation&lt;bool&gt;。您可以使用AsTask 扩展方法获取任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多