VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > c#编程 >
  • C#中如何实现Task任务超时取消、超时取消然后重试超过重试最大次数则结束

在C#中,你可以使用`Task`、`CancellationToken`、`CancellationTokenSource`以及`Task.Delay`来实现任务超时取消,并且结合循环来实现超时取消后的重试逻辑。以下是一个简单的示例,展示了如何实现这一功能:
 
using System;
using System.Threading;
using System.Threading.Tasks;
 
public class TaskWithRetry
{
    private static readonly Random Random = new Random();
 
    // 模拟一个可能失败的任务
    private static async Task<bool> SimulateTask(CancellationToken token)
    {
        // 假设任务需要随机时间来完成,并且有可能失败
        await Task.Delay(Random.Next(100, 2000), token); // 模拟工作耗时,并且接受取消标记
       
        // 随机确定任务是否成功
        if (Random.NextDouble() < 0.8) // 假设有20%的几率失败
        {
            throw new TimeoutException("Task timed out or failed.");
        }
 
        return true; // 任务成功
    }
 
    // 执行任务,支持超时取消和重试
    public static async Task<bool> RunTaskWithRetryAsync(int maxRetries, TimeSpan timeout)
    {
        for (int retryCount = 0; retryCount < maxRetries; retryCount++)
        {
            using (var cts = new CancellationTokenSource(timeout)) // 创建超时取消源
            {
                try
                {
                    // 执行可能失败的任务
                    await SimulateTask(cts.Token);
                    // 如果到这里说明任务成功,返回true
                    return true;
                }
                catch (OperationCanceledException) when (cts.IsCancellationRequested) // 捕获超时取消异常
                {
                    // 如果不是最后一次重试,则等待一段时间后重试
                    if (retryCount < maxRetries - 1)
                    {
                        Console.WriteLine($"Task cancelled due to timeout. Retry {retryCount + 1}/{maxRetries}...");
                        // 等待一段时间后再重试(可选)
                        await Task.Delay(TimeSpan.FromSeconds(5));
                    }
                    else
                    {
                        // 如果是最后一次重试,则直接抛出异常或返回false
                        Console.WriteLine($"Task cancelled due to timeout. Maximum retries exceeded.");
                        return false;
                    }
                }
                catch (Exception ex) // 捕获其他异常(如任务内部抛出的异常)
                {
                    Console.WriteLine($"Task failed with exception: {ex.Message}");
                    // 根据需要处理异常,例如记录日志、返回false或抛出异常
                    return false;
                }
            }
        }
 
        // 如果循环结束都没有成功,则返回false
        return false;
    }
 
    public static async Task Main(string[] args)
    {
        try
        {
            bool success = await RunTaskWithRetryAsync(3, TimeSpan.FromSeconds(2)); // 最多重试3次,每次超时2秒
            Console.WriteLine($"Task completed successfully: {success}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}
 
在上面的示例中,`SimulateTask`方法模拟了一个可能失败的任务,它接受一个`CancellationToken`作为参数以便在超时时能够取消。`RunTaskWithRetryAsync`方法封装了任务执行和重试的逻辑,使用`CancellationTokenSource`来管理超时时间,并通过`for`循环实现重试。如果任务在超时时间内没有完成或者达到最大重试次数,则方法会返回`false`。如果任务成功完成,则返回`true`。
 
注意:在实际使用中,你应该根据你的业务逻辑来处理超时和重试的情况,例如记录日志、发送通知等。此外,你可能还需要考虑更复杂的重试策略,例如指数退避(Exponential Backoff)等。


最后,如果你对C#语言还有任何疑问或者需要进一步的帮助,请访问https://www.xin3721.com 本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49567.html

相关教程