По сути, в моем приложении есть много мест, где, чтобы что-то сделать, мне нужно убедиться, что изображение продукта загружено. Я хочу централизовать этот вызов в одном месте, чтобы загрузить его только один раз. Я пытаюсь сделать это в своем классе:
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 и, кажется, имеет гораздо более сложную цель.)
Task<T>
я уверен, что с вами все будет в порядке... похоже, это проблема, специфичная для WinRT :( - person Jon Skeet   schedule 18.09.2012create_task
для одногоIAsyncOperation
. Лучше кэшировать задачи, чем IAsyncOperations в C++. - person Filip Skakun   schedule 16.09.2014