多个调用等待同一异步任务

时间:2012-09-17 22:23:11

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

基本上我的应用程序中有很多地方为了做一些事我需要确保下载产品图像。我想将此调用集中到一个地方,所以我确保只下载一次。我想在班上这样做:

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而且似乎有一个更复杂的目标。)

1 个答案:

答案 0 :(得分:1)

尝试使用Task<bool>代替IAsyncOperation<bool>。您可以使用AsTask扩展程序获取任务。