在 C# 异步编程中,TaskCompletionSource<T> 是一个非常强大的工具,它允许我们手动控制 Task 的完成状态。然而,在实际开发中,我们经常需要为这些任务设置超时机制,以避免程序无限期等待。本文将带你从零开始,深入浅出地理解如何使用 C# TaskCompletionSource 超时控制,即使你是编程小白也能轻松上手!
TaskCompletionSource<T> 是 .NET 提供的一个类,用于创建一个可手动完成的 Task<T>。它常用于将基于回调或事件的 API 包装成基于 Task 的异步方法。
在异步操作中,如果某个任务因为网络延迟、资源阻塞或其他原因长时间未完成,程序可能会“卡住”。为了避免这种情况,我们需要为任务设置一个最大等待时间——这就是超时控制的作用。
我们可以结合 Task.Delay 和 Task.WhenAny 来实现超时控制。基本思路是:同时启动两个任务——一个是我们的主任务(由 TaskCompletionSource 控制),另一个是延迟任务(代表超时)。谁先完成,就以谁的结果为准。
using System;using System.Threading;using System.Threading.Tasks;class Program{ static async Task<string> DoWorkWithTimeout(int timeoutMs) { var tcs = new TaskCompletionSource<string>(); // 模拟一个可能长时间运行的操作(比如网络请求) _ = Task.Run(async () => { await Task.Delay(3000); // 模拟耗时 3 秒 tcs.SetResult("操作成功完成!"); }); // 创建超时任务 var timeoutTask = Task.Delay(timeoutMs); // 等待任意一个任务完成 var completedTask = await Task.WhenAny(tcs.Task, timeoutTask); if (completedTask == tcs.Task) { return await tcs.Task; // 正常完成 } else { throw new TimeoutException($"操作超时(超过 {timeoutMs} 毫秒)!"); } } static async Task Main(string[] args) { try { // 设置超时时间为 2000 毫秒(2 秒) string result = await DoWorkWithTimeout(2000); Console.WriteLine(result); } catch (TimeoutException ex) { Console.WriteLine(ex.Message); } }} 在这个例子中,模拟的操作需要 3 秒完成,但我们设置了 2 秒的超时。因此程序会抛出 TimeoutException,而不是无限等待。
为了提高代码复用性,我们可以将超时逻辑封装成一个扩展方法:
public static class TaskExtensions{ public static async Task<T> WithTimeout<T>( this Task<T> task, int millisecondsTimeout) { if (task == await Task.WhenAny(task, Task.Delay(millisecondsTimeout))) { return await task; } else { throw new TimeoutException($"任务超时({millisecondsTimeout} 毫秒)"); } }}// 使用方式:// var result = await tcs.Task.WithTimeout(2000); CancellationToken 使用。Task.Delay 的精度受系统计时器影响,不适用于微秒级高精度场景。通过本文,你已经学会了如何在 C# 中对 TaskCompletionSource<T> 实现超时控制。这是 异步编程 中一项非常实用的技能,能显著提升应用程序的健壮性和用户体验。记住关键词:C# TaskCompletionSource、超时控制、异步编程,它们是你进阶 .NET 开发的重要基石!
赶快在你的项目中尝试吧!如有疑问,欢迎在评论区交流。
本文由主机测评网于2025-12-20发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251210714.html