Я использую асинхронную операцию, которая завершается в три этапа, возвращая частичные результаты до завершения.Первоначально он использует события для оповещения о прогрессе, и я хочу правильно обернуть его как await
способную операцию (или их цепочку).
Точнее, это метод PhotoCamera.CaptureImage в Windows Phone 7, который генерирует события в следующем порядке (с соответствующими типами результатов):
CaptureStarted
, не очень интересно для меня CaptureThumbnailAvailable
(Stream) CaptureImageAvailable
(Stream) CaptureCompleted
(bool)
Как это обернуть?В настоящее время я использую TaskCompletionSource
и звоню SetResult
на CaptureCompleted
.Он не обращается к шагам 2 и 3, миниатюра и изображение становятся доступными.Я решил использовать обратные вызовы для них.
Мой метод расширения (опуская код для краткости):
public static Task<bool> CaptureImageAsync(this PhotoCamera photoCamera,
Action<Stream> thumbnailAvailableCallback,
Action<Stream> imageAvailableCallback)
Это не совсем чисто, смесь задач и обратных вызовов.Я знаю о IProgress<T>
.Однако значения прогресса не имеют одинакового типа (Stream, Stream, bool) ... и разве это не слишком растянет шаблон IProgress<T>
?
Использование нескольких Task<T>
, которые ожидаются по порядку, является опцией, но это предполагает определенный порядок, который я также должен был бы каким-то образом применять.Может быть, каждый результат задачи может содержать «следующую» задачу в качестве члена:
ThumbnailResult thumbnailResult = await photoCamera.CaptureImageAsync();
...
ImageResult imageResult = await thumbnailResult.NextTask;
...
bool finalResult = await imageResult.NextTask;
Я все еще думаю, что я здесь несколько ошибочен.Идеи?