c# - 我可以在 IProgress.Report 上等待吗

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

我遵循以下描述的模式: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订单..

最佳答案

不,您不能“等待”IProgress.Report。进度报告本质上是即发即弃。

但是,您可以使用自己的具有适当语义的 IProgress 实现。特别是,Reactive Extensions 非常适合驯服“数据流”(在本例中为进度报告流)。

关于c# - 我可以在 IProgress.Report 上等待吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37883297/

相关文章:

node.js - Node js : child_process. exec 实际上并未等待

f# - C++ AMP库对F#有用吗?

c# - await vs Task.Wait - 死锁?

c# - Visual Studio 找不到 SingleInstanceFactory

C# { } 运算符

c# - Xamarin.iOS 异步 ViewDidLoad

c# - 自定义任务运行程序方法抛出 ArgumentException

c# - "No target found for method"由 Caliburn Message.Attach() 抛出

c# - 单元测试 NotifyPropertyChanged()

c# - CancellationToken 注销操作