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));//模拟业务操作,耗时任务。
- }
- }
复制代码 测试用例:
[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 |
|
|
|
发表于 2023-7-25 14:41:07
举报
回复
分享
|
|
|
|