C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# 超时停止

C#实现方法超时停止的几种方式

作者:张工想跑路

本文主要介绍了C#实现方法超时停止的几种方式,包括使用CancellationToken、Task.Wait、Task.WhenAny和第三方库Polly实现方法超时控制的方法,感兴趣的可以了解一下

使用CancellationToken实现超时控制

在C#中,可以通过CancellationTokenSourceCancellationToken实现方法超时停止。创建一个带有超时设置的CancellationTokenSource,将token传递给需要控制的方法。

using System.Threading;
using System.Threading.Tasks;

public async Task ExecuteWithTimeoutAsync()
{
    var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); // 5秒超时
    
    try
    {
        await LongRunningMethodAsync(cts.Token);
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine("操作已超时取消");
    }
}

private async Task LongRunningMethodAsync(CancellationToken token)
{
    for (int i = 0; i < 10; i++)
    {
        token.ThrowIfCancellationRequested();
        await Task.Delay(1000, token); // 模拟耗时操作
        Console.WriteLine($"执行第{i+1}步");
    }
}

使用Task.Wait或Task.WhenAny实现超时

对于非异步方法或需要更灵活控制的场景,可以使用Task.WaitTask.WhenAny配合超时设置。

var task = Task.Run(() => LongRunningMethod());
if (!task.Wait(TimeSpan.FromSeconds(5)))
{
    Console.WriteLine("方法执行超时");
}

// 或者使用WhenAny
var timeoutTask = Task.Delay(TimeSpan.FromSeconds(5));
var completedTask = await Task.WhenAny(task, timeoutTask);
if (completedTask == timeoutTask)
{
    Console.WriteLine("方法执行超时");
}

使用第三方库Polly实现超时策略

Polly是一个.NET弹性和瞬态故障处理库,提供了简洁的超时策略实现方式。

using Polly;

var policy = Policy.TimeoutAsync(TimeSpan.FromSeconds(5), 
    TimeoutStrategy.Pessimistic);

try
{
    await policy.ExecuteAsync(async token => 
    {
        await LongRunningMethodAsync(token);
    }, CancellationToken.None);
}
catch (TimeoutRejectedException)
{
    Console.WriteLine("操作已超时");
}

注意事项

处理超时时需要考虑资源清理问题,确保方法被中断时能正确释放资源。对于无法响应取消请求的阻塞操作,可能需要使用单独的线程或进程来终止。

某些场景下可能需要结合多种技术,如先尝试优雅取消,超时后强制终止线程。强制终止线程可能带来资源泄漏风险,应谨慎使用。

到此这篇关于C#实现方法超时停止的几种方式的文章就介绍到这了,更多相关C# 超时停止内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文