2

Basically I have a lot of places in my app where in order to do something I need to make sure a product image is downloaded. I want to centralize this call into one place so I make sure to only download it once. I'm trying to do like this in my class:

private IAsyncOperation<bool> _downloadCoverTask;

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

    return this._downloadCoverTask;
}

_cloudProduct.Image.DownloadAsync() is a method which actually does the image downloading (it also happens to be in a library that I don't control).

So in my code where I need to download the image, I do

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

This works ok the first time I call it, but the second time it's called I get the exception "A delegate was assigned when not allowed." I don't get any stack trace or anything either.

This would get called a bunch of places, but I'm hoping that they would all wait on the same task, and then continue when it's complete. If it's already completed I hope it would just return right away. It's possible that I'm misunderstanding and that's just not how it works?

(Yes, I posted this before, but wasn't able to get an answer and I think this question summarizes the issue better. There is also this question, but that uses TPL and seems to have a much more complex goal.)

4

1 に答える 1

1

Task<bool>の代わりにを使用してみてくださいIAsyncOperation<bool>AsTask拡張メソッドを使用してタスクを取得できます。

于 2012-09-17T22:39:44.647 に答える