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);
    }
}
相关推荐
韩曙亮13 小时前
【Flutter】Flutter 编译 Web 网站 ① ( Tomcat 部署 Web 网站 )
前端·flutter·tomcat·web
一条泥憨鱼13 小时前
苍穹外卖【day5|Redis与店铺营业状态设置】
java·后端·mybatis·苍穹外卖
古怪今人13 小时前
手工搭建PC端:pnpm + Vite + Vue3 + Element Plus + Electron
前端·vue.js·electron
要开心吖ZSH13 小时前
AI医疗分诊与健康咨询助手agent开发——(2)让AI输出可控:结构化分诊与安全规则
java·ai·agent·健康医疗·spring ai
共创splendid--与您携手14 小时前
AI读取前端项目生成skill.md
前端·人工智能·ai
San813_LDD15 小时前
[C语言]《Dev-C++ 报错解决手册(Day0607 精华版)》
java·前端·javascript
Anastasiozzzz16 小时前
从有限状态机到智能体图:传统 FSM 与 Agent Graph的演进
java·人工智能·python·ai
xiaofeichaichai21 小时前
Webpack
前端·webpack·node.js
问心无愧051321 小时前
ctf show web入门111
android·前端·笔记