C# 为异步函数实现WaitAsync方法

C# 为异步函数实现WaitAsync方法

​.NET 6 开始,System.Threading.Tasks.Task类 ​原生提供了 WaitAsync方法,该方法可以很方便的为任意异步函数提供超时功能。但是Framework没有该方法。不过我们可以通过Task.WhenAny方法可以实现类似的功能 。

  1. 无返回值
csharp 复制代码
/// <summary>
/// 异步等待任务完成,支持超时
/// </summary>
/// <param name="task">要等待的任务</param>
/// <param name="timeoutMilliseconds">超时时间(毫秒)</param>
/// <returns>任务本身</returns>       
public static async Task WaitAsync(this Task task, int timeout)
{
    if (task == null)
        throw new ArgumentNullException(nameof(task));
    if (task.IsCompleted)
        return;
    using (CancellationTokenSource cts = new CancellationTokenSource())
    {
        Task completedTask = await Task.WhenAny(task, Task.Delay(timeout, cts.Token)).ConfigureAwait(false);
        if (completedTask != task)
            throw new TimeoutException($"等待任务超时({timeout} 毫秒)");
        cts.Cancel();
        await task.ConfigureAwait(false);
    }
}
  1. 有返回值
csharp 复制代码
/// <summary>
/// 异步等待一个 Task<T> 完成,并获取结果,支持超时
/// </summary>
/// <typeparam name="T">任务返回的数据类型</typeparam>
/// <param name="task">要等待的任务</param>
/// <param name="timeoutMilliseconds">超时时间(毫秒)</param>
/// <returns>任务的结果 T</returns>      
public static async Task<T> WaitAsync<T>(this Task<T> task, int timeout)
{
    if (task == null)
        throw new ArgumentNullException(nameof(task));
    if (task.IsCompleted)
        return task.Result;
    using (CancellationTokenSource cts = new CancellationTokenSource())
    {
        Task completedTask = await Task.WhenAny(task, Task.Delay(timeout, cts.Token)).ConfigureAwait(false);
        if (completedTask != task)
            throw new TimeoutException($"等待任务超时({timeout} 毫秒)");
        cts.Cancel();
        return await task.ConfigureAwait(false);
    }
}
相关推荐
云原生指北1 小时前
GitHub Copilot SDK 入门:五分钟构建你的第一个 AI Agent
java
用户69371750013844 小时前
Google 正在“收紧侧加载”:陌生 APK 安装或需等待 24 小时
android·前端
蓝帆傲亦4 小时前
Web 前端搜索文字高亮实现方法汇总
前端
用户69371750013844 小时前
Room 3.0:这次不是升级,是重来
android·前端·google
似水明俊德5 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
Leinwin5 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
漫随流水5 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
薛定谔的悦5 小时前
MQTT通信协议业务层实现的完整开发流程
java·后端·mqtt·struts
enjoy嚣士6 小时前
springboot之Exel工具类
java·spring boot·后端·easyexcel·excel工具类
罗超驿6 小时前
独立实现双向链表_LinkedList
java·数据结构·链表·linkedlist