c# – 多个任务或IProgress部分完成?

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

确切地说,它是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);

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...