翼度科技»论坛 编程开发 .net 查看内容

C# Task 实现任务超时取消、超时取消然后重试 超过重试最大次数就结束。

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
任务超时取消 示例
  1.         public static async Task TimeoutCancelTask()
  2.         {
  3.             CancellationTokenSource cts = new CancellationTokenSource();//取消令牌
  4.             Task task = DoAction(cts);//业务异步任务
  5.             double timeoutSeconds = 2;//超时时间 秒
  6.             Task delayTask = Task.Delay(TimeSpan.FromSeconds(timeoutSeconds));//指定一个等待任务 等待到超时时间
  7.             Task completeTask = await Task.WhenAny(task, delayTask);//等待两个任务,任意一个任务执行完成。返回率先完成的任务
  8.             if (completeTask == delayTask)//如果率先完成的是超时等待任务,就说明业务任务执行超时了。
  9.             {
  10.                 cts.Cancel();//取消令牌 状态改为取消
  11.                 Console.WriteLine("任务已超时取消");
  12.             }
  13.             else
  14.             {
  15.                 Console.WriteLine("任务已完成");
  16.             }
  17.         }
  18.         //模拟业务任务
  19.         public static async Task DoAction(CancellationTokenSource cts)
  20.         {
  21.             await Task.Delay(200);
  22.             for (int i = 1; i <= 5; i++)
  23.             {
  24.                 if (cts.IsCancellationRequested)//在业务任务每个耗时的操作开始之前判断取消令牌是否已取消
  25.                     break;
  26.                 Console.WriteLine(i);
  27.                 await Task.Delay(TimeSpan.FromSeconds(1));//模拟业务操作,耗时任务。
  28.             }
  29.         }
复制代码
测试用例:

[code]        public static async Task Go()        {            double timeoutSeconds = 2;//超时时间 秒            int maxRetryCount = 2;//最大重试次数            CancellationTokenSource cts = new CancellationTokenSource();            bool isSuccess = false;            string result = string.Empty;            //1.超时取消任务 无返回值            //isSuccess = await TaskExtensions.TimeoutCancelAsync((cts) => DoActionNoResult(cts), timeoutSeconds, cts);            //1.超时取消任务 无返回值            //(isSuccess, result) = await TaskExtensions.TimeoutCancelAsync((cts) => DoActionWithResult(cts), timeoutSeconds, cts);            //3.超时取消并重试任务 无返回值            //isSuccess = await TaskExtensions.TimeoutRetryAsync((cts) => DoActionNoResult(cts), timeoutSeconds, maxRetryCount, cts);            //4.超时取消并重试任务 带返回值任务            (isSuccess, result) = await TaskExtensions.TimeoutRetryAsync((cts) => DoActionWithResult(cts), timeoutSeconds, maxRetryCount, cts);                        if(isSuccess)             {                Console.WriteLine("任务执行成功,结果:" + result);            }            else            {                Console.WriteLine("任务执行失败!");            }            Console.ReadLine();        }        public static async Task DoActionNoResult(CancellationTokenSource cts)        {            await Task.Delay(200);            for (int i = 1; i

举报 回复 使用道具