我正在使用一个异步操作,它完成三个步骤,在完成之前返回部分结果.最初它使用事件来表示进度,我想将它正确地包装为一个等待操作(或它们的链).
确切地说,它是Windows Phone 7中的PhotoCamera.CaptureImage方法,它按以下顺序触发事件(具有相关结果类型):
> CaptureStarted,对我来说不是那么有趣
> CaptureThumbnailAvailable(Stream)
> CaptureImageAvailable(Stream)
> CaptureCompleted(bool)
怎么包这个?目前我正在使用TaskCompletionSource并在CaptureCompleted上调用SetResult.它没有解决步骤2和3,缩略图和图像变得可用.我决定使用回调代替那些.
我的扩展方法(省略代码简洁):
public static Task<bool> CaptureImageAsync(this PhotoCamera photoCamera,
Action<Stream> thumbnailAvailableCallback,
Action<Stream> imageAvailableCallback)
这并不完全干净,是任务和回调的混合体.我知道IProgress< T>.然而,进度值不是统一类型(Stream,Stream,bool)……并且不会拉伸IProgress< T>.模式太远了吗?
使用多个任务< T>正在等待的是一个选项,但是假设我还必须以某种方式强制执行特定的顺序.也许每个任务结果都可以包含“下一个”任务作为成员:
ThumbnailResult thumbnailResult = await photoCamera.CaptureImageAsync();
...
ImageResult imageResult = await thumbnailResult.NextTask;
...
bool finalResult = await imageResult.NextTask;
我仍然认为我在这里有点不合时宜.想法?
最佳答案 我个人将为它创建一个类,其中3个方法返回Task< T>.调用者将能够以他想要的任何顺序调用3种方法,并且它始终有效.如果先调用GetFinalResultAsync然后再调用GetThumbnailAsync,那么结果就是第二个任务< T>当使用await并且它将同步返回时,将得到一个结果.
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);