首页 > 代码库 > [C#并发编程学习笔记].NET 异步操作执行中显示执行进度,并可取消异步操作

[C#并发编程学习笔记].NET 异步操作执行中显示执行进度,并可取消异步操作

在异步方法执行过程中报告进度可以使用Progress<T>类型,创建一个Progress<T>类型的实例,并为它添加报告事件,作为参数传入异步方法中。上代码:

我们需要调用的异步方法:

 1 /// <summary> 2 /// 报告进度并且可取消的异步任务 3 /// </summary> 4 /// <param name="token"></param> 5 /// <param name="progress"></param> 6 /// <returns></returns> 7 public static async Task ProgressAsync(CancellationToken token, IProgress<double> progress = null) 8 { 9   double percentComplete = 0;10   //进度未达到100%时循环执行,模拟一个长时间执行的任务11   while (percentComplete<=100)12   {13     //判断取消标记14     if (token.IsCancellationRequested)15       return;16     //报告给调用者17     progress?.Report(percentComplete);18     await Task.Delay(TimeSpan.FromSeconds(1));19     percentComplete += 10;20   }21 }

 

调用方法:

 1 static readonly CancellationTokenSource Token = new CancellationTokenSource(); 2  3 /// <summary> 4 /// 调用报告进度的方法 5 /// </summary> 6 /// <returns></returns> 7 private async static Task ProgressTest(){ 8   //创建progress实例 9   var progress=new Progress<double>();10   //添加报告时的响应事件11   progress.ProgressChanged += (sender, args) =>12   {13     Console.WriteLine($"当前进度{args}%");14   };15   //调用报告方法16   await Charpt1.Charpt1.ProgressAsync(Token.Token, progress);17 }

 

执行的Main方法如下:

 1 static void Main(string[] args) 2 { 3   ProgressTest(); 4   var key = Console.ReadKey(); 5   //当输入字符为j时取消任务 6   if (key.KeyChar == j) 7   { 8     Token.Cancel(); 9     Console.WriteLine("任务被取消!");10   }11   Console.ReadLine();12 }

 

当我们不取消任务时,可以看到以下结果

技术分享

 

在执行过程中输入‘j‘,以取消任务,结果如下:

技术分享

 

[C#并发编程学习笔记].NET 异步操作执行中显示执行进度,并可取消异步操作