【问题标题】:Can I await on IProgress.Report我可以在 IProgress.Report 上等待吗
【发布时间】:2016-06-17 13:47:35
【问题描述】:

我遵循https://blogs.msdn.microsoft.com/dotnet/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis/ 中描述的模式,所以我在异步方法中使用 IProgress.Report 来报告进度。

public async Task MyFirstTaskAsync(IProgress<T> progress)
{
    progress.report(some T)
}

public async Task MySecondTaskAsync(IProgress<T> progress)
{
    progress.report(some T)
}

在 UI 线程上,我将依次调用 MyFirstTaskAsync 和 MySecondTaskAsync。

var reportProgress1 = new Action<T> (x =>Console.WriteLine("First Step Completed"))
var reportProgress2 = new Action<T> (x =>Console.WriteLine("Last Step Completed"))
var progress1 = new Progress<T>(reportProgress1 )
var progress2 = new Progress<T>(reportProgress2 )
await MyFirstTaskAsync(progress1)
Console.WriteLine("Second Step Comppleted")
await MySecondTaskAsync(progress2)
//code in reportProgress1.report can actually be executed at this point...

我的问题是 reportProgress1.report 中的代码实际上可以在 MyFirstTaskAsync 完成后执行,这有点弄乱了进度报告,因为我希望第一个 await 可以等待,直到第一个异步方法中的进度报告也完成。

这是一种我可以通过某种方式调整以满足我的需要的行为吗?

谢谢。

编辑:假设两个任务之间有一些非异步代码,这三个任务一起完成了整个过程,并且每个任务都会在运行时更新进度,因此他们必须按顺序更新 UI订购..

【问题讨论】:

  • 谢谢。我更新了问题以澄清我的问题。基本上,这些任务共同完成了一个整体过程,所以我希望他们的进度更新按特定顺序发生。

标签: c# async-await task-parallel-library


【解决方案1】:

不,你不能“等待”IProgress.Report。进度报告本质上是一劳永逸的。

但是,您可以使用自己的 IProgress 实现和适当的语义。特别是,响应式扩展非常适合驯服“数据流”(在这种情况下,是进度报告流)。

【讨论】:

  • 啊..谢谢..我可以看到Progress.Report 使用SynchronizationContext.Post 来执行代码,就像你说的我猜这只是“即发即弃”.. 有没有简单的在同步上下文上立即执行某事的方法
  • @Godsent:是的,Send 是同步的。
  • 谢谢,这行得通。我刚刚将所有现有的Progress 代码复制/粘贴到ProgressWithSyncReport 类并将SynchronizationContext.Send 更改为SynchronizationContext.Post .. 尽管Progress 类中的OnReport 方法是虚拟的,但我也觉得它令人费解,但我可以'不要只是覆盖它来继承,因为其他一切都是私有的......
猜你喜欢
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多