如果您使用的是 .NET 4.5,您将可以访问最新版本的 TPL 更改,其中包括IProgress<T>
接口及其具体实现Progress<T>
。该界面旨在支持两个异步任务之间的进度报告,特别是您所追求的后台到 UI 线程的报告。
接口本身很简单,将Report(T)
方法定义为将类型的进度更新传递T
给其他任务的机制。当您有一些进展要报告时,您调用该操作。如果您想传递百分比进度,可以传递0.1
给IProgress<float>
实例以报告 10% 的进度。
private async Task BackgroundWorkAsync(IProgress<float> progress)
{
...
progress.Report(0.1); // 10%
...
progress.Report(1.0); // 100%
}
UI 线程应该创建具体Progress<T>
实例并将其传递到后台任务的范围内。Progress<T>
提供一个ProgressChanged
您可以订阅的事件,但通常您将一个操作传递给构造函数,以便在每次更新进度时调用:
var progress = new Progress(value => // set progress bar);
await this.BackgroundWorkAsync(progress);
这是一个粗略的例子,但它展示了如何Progress<T>
根据上下文同步回调的魔力,在这种情况下是 UI 线程。