Несколько вызовов ожидают выполнения одной и той же асинхронной задачи

По сути, в моем приложении есть много мест, где, чтобы что-то сделать, мне нужно убедиться, что изображение продукта загружено. Я хочу централизовать этот вызов в одном месте, чтобы загрузить его только один раз. Я пытаюсь сделать это в своем классе:

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

Это работает нормально при первом вызове, но при втором вызове я получаю исключение «Делегат был назначен, когда это не разрешено». Я не получаю никакой трассировки стека или чего-то еще.

Это можно было бы назвать кучей мест, но я надеюсь, что все они будут ждать одной и той же задачи, а затем продолжат работу, когда она будет завершена. Если он уже завершен, я надеюсь, что он сразу же вернется. Возможно, я неправильно понимаю, и это просто не так, как это работает?

(Да, я опубликовал это ранее, но не смог получить ответ, и я думаю, что этот вопрос лучше резюмирует проблему. Существует также этот вопрос, но он использует TPL и, кажется, имеет гораздо более сложную цель.)


person Josh Santangelo    schedule 17.09.2012    source источник
comment
Для Task<T> я уверен, что с вами все будет в порядке... похоже, это проблема, специфичная для WinRT :(   -  person Jon Skeet    schedule 18.09.2012
comment
Я собирался опубликовать тот же ответ, что и на ваш другой вопрос. Не могли бы вы описать, почему это не сработало?   -  person Stephen Cleary    schedule 18.09.2012
comment
Для потомков - одно место, где эта ошибка также может отображаться, - это когда в C++ вы дважды вызываете create_task для одного IAsyncOperation. Лучше кэшировать задачи, чем IAsyncOperations в C++.   -  person Filip Skakun    schedule 16.09.2014


Ответы (1)


Попробуйте использовать Task<bool> вместо IAsyncOperation<bool>. Получить задание можно с помощью метода расширения AsTask.

person Thomas Levesque    schedule 17.09.2012