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

 更新时间:2025年11月16日 16:02:12   作者:张工想跑路  
本文主要介绍了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# 超时停止内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#使用SemaphoreSlim实现并发控制与限流策略的实战指南

    C#使用SemaphoreSlim实现并发控制与限流策略的实战指南

    在现代应用中(如爬虫、并发请求、数据库连接池、异步任务处理),我们常常需要限制同时执行的任务数量,以避免过载或资源竞争,在 C# 中,最简洁高效的解决方案之一就是SemaphoreSlim,本文就给大家介绍了C#使用SemaphoreSlim实现并发控制与限流策略的实战指南
    2025-11-11
  • c# 实现位图算法(BitMap)

    c# 实现位图算法(BitMap)

    这篇文章主要介绍了c# 如何实现位图算法(BitMap),文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • UnityWebRequest前后端交互实现过程解析

    UnityWebRequest前后端交互实现过程解析

    这篇文章主要介绍了UnityWebRequest前后端交互实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • C#集合之并发集合的用法

    C#集合之并发集合的用法

    这篇文章介绍了C#集合之并发集合的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • c#循环左移字符示例

    c#循环左移字符示例

    这篇文章主要介绍了c#循环左移字符示例,需要的朋友可以参考下
    2014-04-04
  • c#创建windows服务入门教程实例

    c#创建windows服务入门教程实例

    windows服务是windows系统中一类特殊的应用程序,一般情况下它们只会在后台运行,不会影响前台操作,非常适合做一些不需要用户参与的而又需要长时间执行的任务
    2014-04-04
  • 使用C#自动化生成Excel单元格数据验证

    使用C#自动化生成Excel单元格数据验证

    在日常报表开发中,Excel 的数据准确性和可控性与格式美观同样重要,本文将演示如何在 同一个工作表中 设置 下拉列表、数值范围、日期区间、文本长度、自定义公式和输入提示,有需要的小伙伴可以了解下
    2025-09-09
  • C#开发webService接口的流程步骤

    C#开发webService接口的流程步骤

    在C#中,Web Service 接口是一种用于远程程序间的通信机制,它允许客户端通过HTTP协议访问服务器端提供的功能和服务,本文给大家详细介绍了C#开发webService接口的流程步骤,需要的朋友可以参考下
    2024-11-11
  • 桌面浮动窗口(类似恶意广告)的实现详解

    桌面浮动窗口(类似恶意广告)的实现详解

    本篇文章是对桌面浮动窗口的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C#线程定义和使用方法详解

    C#线程定义和使用方法详解

    这篇文章主要介绍了C#Thread类的基本用法,如何定义一个线程类,为线程传递参数的方法,详解看下文
    2013-11-11

最新评论