C#實(shí)現(xiàn)方法超時停止的幾種方式
使用CancellationToken實(shí)現(xiàn)超時控制
在C#中,可以通過CancellationTokenSource和CancellationToken實(shí)現(xiàn)方法超時停止。創(chuàng)建一個帶有超時設(shè)置的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($"執(zhí)行第{i+1}步");
}
}
使用Task.Wait或Task.WhenAny實(shí)現(xiàn)超時
對于非異步方法或需要更靈活控制的場景,可以使用Task.Wait或Task.WhenAny配合超時設(shè)置。
var task = Task.Run(() => LongRunningMethod());
if (!task.Wait(TimeSpan.FromSeconds(5)))
{
Console.WriteLine("方法執(zhí)行超時");
}
// 或者使用WhenAny
var timeoutTask = Task.Delay(TimeSpan.FromSeconds(5));
var completedTask = await Task.WhenAny(task, timeoutTask);
if (completedTask == timeoutTask)
{
Console.WriteLine("方法執(zhí)行超時");
}
使用第三方庫Polly實(shí)現(xiàn)超時策略
Polly是一個.NET彈性和瞬態(tài)故障處理庫,提供了簡潔的超時策略實(shí)現(xiàn)方式。
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("操作已超時");
}
注意事項(xiàng)
處理超時時需要考慮資源清理問題,確保方法被中斷時能正確釋放資源。對于無法響應(yīng)取消請求的阻塞操作,可能需要使用單獨(dú)的線程或進(jìn)程來終止。
某些場景下可能需要結(jié)合多種技術(shù),如先嘗試優(yōu)雅取消,超時后強(qiáng)制終止線程。強(qiáng)制終止線程可能帶來資源泄漏風(fēng)險,應(yīng)謹(jǐn)慎使用。
到此這篇關(guān)于C#實(shí)現(xiàn)方法超時停止的幾種方式的文章就介紹到這了,更多相關(guān)C# 超時停止內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用SemaphoreSlim實(shí)現(xiàn)并發(fā)控制與限流策略的實(shí)戰(zhàn)指南
在現(xiàn)代應(yīng)用中(如爬蟲、并發(fā)請求、數(shù)據(jù)庫連接池、異步任務(wù)處理),我們常常需要限制同時執(zhí)行的任務(wù)數(shù)量,以避免過載或資源競爭,在 C# 中,最簡潔高效的解決方案之一就是SemaphoreSlim,本文就給大家介紹了C#使用SemaphoreSlim實(shí)現(xiàn)并發(fā)控制與限流策略的實(shí)戰(zhàn)指南2025-11-11
UnityWebRequest前后端交互實(shí)現(xiàn)過程解析
這篇文章主要介紹了UnityWebRequest前后端交互實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
c#創(chuàng)建windows服務(wù)入門教程實(shí)例
windows服務(wù)是windows系統(tǒng)中一類特殊的應(yīng)用程序,一般情況下它們只會在后臺運(yùn)行,不會影響前臺操作,非常適合做一些不需要用戶參與的而又需要長時間執(zhí)行的任務(wù)2014-04-04
使用C#自動化生成Excel單元格數(shù)據(jù)驗(yàn)證
在日常報表開發(fā)中,Excel 的數(shù)據(jù)準(zhǔn)確性和可控性與格式美觀同樣重要,本文將演示如何在 同一個工作表中 設(shè)置 下拉列表、數(shù)值范圍、日期區(qū)間、文本長度、自定義公式和輸入提示,有需要的小伙伴可以了解下2025-09-09
桌面浮動窗口(類似惡意廣告)的實(shí)現(xiàn)詳解
本篇文章是對桌面浮動窗口的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

