善良给对人 发表于 2023-7-25 14:41:07

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

任务超时取消 示例

      public static async Task TimeoutCancelTask()
      {
            CancellationTokenSource cts = new CancellationTokenSource();//取消令牌
            Task task = DoAction(cts);//业务异步任务
            double timeoutSeconds = 2;//超时时间 秒
            Task delayTask = Task.Delay(TimeSpan.FromSeconds(timeoutSeconds));//指定一个等待任务 等待到超时时间
            Task completeTask = await Task.WhenAny(task, delayTask);//等待两个任务,任意一个任务执行完成。返回率先完成的任务
            if (completeTask == delayTask)//如果率先完成的是超时等待任务,就说明业务任务执行超时了。
            {
                cts.Cancel();//取消令牌 状态改为取消
                Console.WriteLine("任务已超时取消");
            }
            else
            {
                Console.WriteLine("任务已完成");
            }
      }

      //模拟业务任务
      public static async Task DoAction(CancellationTokenSource cts)
      {
            await Task.Delay(200);
            for (int i = 1; i <= 5; i++)
            {
                if (cts.IsCancellationRequested)//在业务任务每个耗时的操作开始之前判断取消令牌是否已取消
                  break;
                Console.WriteLine(i);
                await Task.Delay(TimeSpan.FromSeconds(1));//模拟业务操作,耗时任务。
            }
      }测试用例:

      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
页: [1]
查看完整版本: C# Task 实现任务超时取消、超时取消然后重试 超过重试最大次数就结束。