标签:
在异步方法执行过程中报告进度可以使用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 异步操作执行中显示执行进度,并可取消异步操作
标签:
原文地址:http://www.cnblogs.com/minhou/p/5878893.html