4

我正在使用分三步完成的异步操作,在完成之前返回部分结果。最初它使用事件来表示进度,我想将它正确地包装为一个await能够操作(或它们的链)。

确切地说,它是 Windows Phone 7 中的 PhotoCamera.CaptureImage 方法,它按以下顺序触发事件(具有相关的结果类型):

  1. CaptureStarted,对我来说没那么有趣
  2. CaptureThumbnailAvailable(溪流)
  3. CaptureImageAvailable(溪流)
  4. CaptureCompleted(布尔)

这个怎么包?目前我正在使用 a并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;

我仍然认为我在这里有些不合时宜。想法?

4

1 回答 1

2

我个人会为它创建一个类,返回 3 个方法Task<T>。调用者将能够以他想要的任何顺序调用这 3 个方法,并且它将始终有效。ifGetFinalResultAsync先调用然后GetThumbnailAsyncthen 唯一的结果是,Task<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);
于 2011-12-02T20:59:46.663 回答