我正在使用一个异步操作,它以三个步骤完成,在完成之前返回部分结果。最初它使用事件来表示进度,我想将其正确地包装为await
能够操作(或它们的链)。
确切地说,它是Windows Phone 7中的PhotoCamera.CaptureImage方法,它按以下顺序触发事件(具有相关结果类型):
CaptureStarted
,对我来说不是那么有趣CaptureThumbnailAvailable
(流)CaptureImageAvailable
(流)CaptureCompleted
(布尔)如何包装?目前,我正在使用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;
我仍然认为我在这方面有点不合时宜。想法?
答案 0 :(得分:2)
我个人会为它创建一个类,返回Task<T>
的3个方法。调用者将能够以他想要的任何顺序调用3种方法,并且它始终有效。如果首先调用GetFinalResultAsync
,然后调用GetThumbnailAsync
,那么只有当使用await并且它将同步返回时,第二个Task<T>
才会产生结果。
var photoCapture = photoCamera.BeginCapture();
var thumbnailResult = await photoCapture.GetThumbnailAsync();
var imageResult = await photoCapture.GetImageAsync();
var finalResult = await photoCapture.GetFinalResultAsync();
等待一切:
var thumbnailTask = photoCapture.GetThumbnailAsync();
var imageTask = photoCapture.GetImageAsync();
var finalTask = photoCapture.GetFinalResultAsync();
await Task.WhenAll(thumbnailTask, imageTask, finalTask);
DoWork(thumbnailTask.Result, imageTask.Result, finalTask.Result);