[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',以取消任务,结果如下:

 

转载于:https://www.cnblogs.com/minhou/p/5878893.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值