Josh Santangelo
Josh Santangelo

Reputation: 918

Multiple calls wait on the same async task

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.)

Upvotes: 2

Views: 862

Answers (1)

Thomas Levesque
Thomas Levesque

Reputation: 292355

Try to use a Task<bool> instead of an IAsyncOperation<bool>. You can get a task using the AsTask extension method.

Upvotes: 1

Related Questions