C# 异步方法 async / await CancellationToken 设置任务超时并手动取消耗时处理

张开发
2026/4/20 5:31:19 15 分钟阅读

分享文章

C# 异步方法 async / await CancellationToken 设置任务超时并手动取消耗时处理
介绍在C#中异步编程通过async和await关键字实现可以提高应用程序的响应性和性能。然而有时候异步任务可能会长时间运行甚至卡住因此需要实现任务超时处理机制。本文将详细介绍如何在C#中使用async/await关键字实现任务超时处理并提供相关代码示例。实现任务超时处理为了实现任务超时处理可以使用Task类提供的Task.WhenAny方法该方法可以等待多个任务完成并返回第一个完成的任务。结合Task.Delay方法可以实现超时处理机制。示例代码以下是一个示例展示了如何在异步方法中实现任务超时处理并在超时后手动取消耗时任务internal class Program { static async Task Main(string[] args) { try { Console.WriteLine(开始耗时任务); int result await ExecuteWithTimeoutAsync(3000); // 设置超时时间为3秒 Console.WriteLine($结果: {result}); } catch (TimeoutException ex) { Console.WriteLine(ex.Message); } Console.WriteLine(\n按任意键退出...); Console.ReadKey(); } /// summary /// 模拟耗时任务 /// /summary /// param namecancellationToken/param /// returns/returns public static async Taskint LongRunningOperationAsync(CancellationToken cancellationToken) { Task delayTask Task.Delay(5000, cancellationToken); // 模拟长时间运行的操作 try { // 等待任务完成如果任务被取消,这里会抛出OperationCanceledException await delayTask; Console.WriteLine(任务完成非取消); return 1; } catch (OperationCanceledException) { Console.WriteLine(任务被取消); } return 0; } /// summary /// 执行任务并指定超时时间 /// /summary /// param nametimeout超时时间单位毫秒/param /// returns/returns public static async Taskint ExecuteWithTimeoutAsync(int timeout) { CancellationTokenSource cts new CancellationTokenSource(); Taskint longRunningTask LongRunningOperationAsync(cts.Token); Task timeoutTask Task.Delay(timeout); Task firstCompletedTask await Task.WhenAny(longRunningTask, timeoutTask); if (firstCompletedTask timeoutTask) { Console.WriteLine(操作超时取消耗时任务); cts.Cancel(); } return await longRunningTask; } }根据执行结果可以看出在耗时任务结束前触发超时并手动取消了耗时任务避免了长时间等待和超时后耗时任务仍在执行的问题。

更多文章