加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:22:13 所属栏目:百科 来源:网络整理
导读:我正在使用一个异步操作,它完成三个步骤,在完成之前返回部分结果.最初它使用事件来表示进度,我想将它正确地包装为一个等待操作(或它们的链). 确切地说,它是Windows Phone 7中的PhotoCamera.CaptureImage方法,它按以下顺序触发事件(具有相关结果类型): Captu
我正在使用一个异步操作,它完成三个步骤,在完成之前返回部分结果.最初它使用事件来表示进度,我想将它正确地包装为一个等待操作(或它们的链).

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读