gpt4 book ai didi

c# - 多个 Task 或 IProgress 用于部分完成?

转载 作者:行者123 更新时间:2023-11-30 12:33:49 32 4
gpt4 key购买 nike

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

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

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

如何包装这个?目前我正在使用 TaskCompletionSource并调用 SetResultCaptureCompleted .它解决步骤 2 和 3,缩略图和图像变得可用。我决定改为使用回调。

我的扩展方法(为了简洁省略了代码):

public static Task<bool> CaptureImageAsync(this PhotoCamera photoCamera,
Action<Stream> thumbnailAvailableCallback,
Action<Stream> imageAvailableCallback)

这感觉并不完全干净,是任务和回调的混合体。我知道IProgress<T> .但是,进度值不是统一类型(Stream、Stream、bool)...并且不会拉伸(stretch) IProgress<T>模式太远?

使用多个 Task<T>按顺序等待的是一个选项,但假设我还必须以某种方式强制执行特定的命令。也许每个任务结果都可以包含“下一个”任务作为成员:

ThumbnailResult thumbnailResult = await photoCamera.CaptureImageAsync();
...
ImageResult imageResult = await thumbnailResult.NextTask;
...
bool finalResult = await imageResult.NextTask;

我仍然认为我在这里有些离题。想法?

最佳答案

我个人会为它创建一个类,其中有 3 个方法返回 Task<T> .调用者将能够以他想要的任何顺序调用这 3 个方法,并且它始终有效。如果GetFinalResultAsync首先被调用然后是GetThumbnailAsync那么唯一的结果就是第二个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);

关于c# - 多个 Task<T> 或 IProgress<T> 用于部分完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8362478/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com