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]