多任务<t>或IProgress <t>部分完成?</t> </t>

时间:2011-12-02 20:50:47

标签: c# asynchronous windows-phone-7.1 task-parallel-library async-ctp

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

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

  1. CaptureStarted,对我来说不是那么有趣
  2. CaptureThumbnailAvailable(流)
  3. CaptureImageAvailable(流)
  4. CaptureCompleted(布尔)
  5. 如何包装?目前,我正在使用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;
    

    我仍然认为我在这方面有点不合时宜。想法?

1 个答案:

答案 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);