C#實現(xiàn)方法超時停止的幾種方式
使用CancellationToken實現(xiàn)超時控制
在C#中,可以通過CancellationTokenSource和CancellationToken實現(xiàn)方法超時停止。創(chuàng)建一個帶有超時設置的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實現(xiàn)超時
對于非異步方法或需要更靈活控制的場景,可以使用Task.Wait或Task.WhenAny配合超時設置。
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實現(xiàn)超時策略
Polly是一個.NET彈性和瞬態(tài)故障處理庫,提供了簡潔的超時策略實現(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("操作已超時");
}
注意事項
處理超時時需要考慮資源清理問題,確保方法被中斷時能正確釋放資源。對于無法響應取消請求的阻塞操作,可能需要使用單獨的線程或進程來終止。
某些場景下可能需要結合多種技術,如先嘗試優(yōu)雅取消,超時后強制終止線程。強制終止線程可能帶來資源泄漏風險,應謹慎使用。
到此這篇關于C#實現(xiàn)方法超時停止的幾種方式的文章就介紹到這了,更多相關C# 超時停止內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
c#打印預覽控件中實現(xiàn)用鼠標移動頁面功能代碼分享
項目中需要實現(xiàn)以下功能:打印預覽控件中,可以用鼠標拖動頁面,以查看超出顯示范圍之外的部分內容,下面就是實現(xiàn)代碼2013-12-12
C#利用Spire.Doc for .NET實現(xiàn)將HTML內容替換到Word模板的實踐指南
本文將深入探討C#如何利用Spire.Doc for .NET庫將HTML內容無縫替換到Word模板中,文中的示例代碼講解詳細,需要的小伙伴可以了解一下2026-02-02

