该框架已经为此目的提供了IProgress接口,并提供了一个正在进行中的实现。要报告进度,请使用进度值调用IProgress.Report。值 T 可以是任何类型,而不仅仅是数字。
每个 IProgress 实现都可以以自己的方式工作。Progress 引发一个事件并调用您在创建它时传递给它的回调。
此外,Progress.Report 异步执行。在幕后,它使用SychronizationContext.Post在创建 Progress 实例的线程上执行其回调和所有事件处理程序。
假设您创建了一个这样的进度值类:
class ProgressValue
{
public long Step{get;set;}
public string Message {get;set;}
}
你可以这样写:
IProgress<ProgressValue> myProgress=new Progress<ProgressValue>(p=>
{
myProgressBar.Value=p.Step;
});
IList<int> myVeryLargeList=...;
Parallel.ForEach(myVeryLargeList,item,state,step=>
{
//Do some heavy work
myProgress.Report(new ProgressValue
{
Step=step,
Message=String.Format("Processed step {0}",step);
});
});
编辑
哎呀!Progress 显式地实现了 IProgress。正如@Tim 所注意到的,您必须将其转换为 IProgress 。
修复了将 myProgress 显式声明为 IProgress 的代码。