首页 > 代码库 > [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 异步操作执行中显示执行进度,并可取消异步操作
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。