并发报告进度
问题
当执行操作时,必须报告进度
解决方案
使用IProcess<T>类型和Progress
代码
async Task MyMethodAsync(IProgress<double> progress=null)
{
    bool done =false;
    double percentComplete=0;
    while(!done)
    {
        ...
        progress?.Report(percentComplete);
    }
}
在调用代码后,可以按下面的方式来使用
async Task CallMyMethodAsync()
{
    var progress=new Progress<double>();
    progress.ProgressChanged+=(sender,args)=>
    {
        ...
    };
    await MyMethodAsync(progress);
}
讨论
IProgress
 IProgress<T>并非专用于异步代码,在跑长线的同步代码中,不论是进度还是取消也都可以而且应该使用