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 分钟前
AI双层代码治理:Monorepo × Harness Engineering
前端·aigc·ai编程
饭小猿人1 分钟前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
byoass5 分钟前
智巢AI知识库深度解析:企业文档管理从大海捞针到精准狙击的进化之路
开发语言·网络·人工智能·安全·c#·云计算
蜡台7 分钟前
H5使用Chrome 权限问题
前端·javascript·chrome
掘金一周15 分钟前
你们觉得房贷多少,没有压力 | 沸点周刊 4.30
前端·人工智能·后端
小小码农Come on17 分钟前
QML访问子项内容
前端·javascript·html
Advancer-31 分钟前
第二次蓝桥杯总结(上)
java·算法·职场和发展·蓝桥杯
han_36 分钟前
一篇看懂国内外主流大模型:GPT、Claude、Gemini、DeepSeek、通义千问有什么区别?
前端·人工智能·llm
\xin42 分钟前
pikachu自编SQL(POST)
java·数据库·sql
一行代码一行诗++44 分钟前
注释是什么和注释该怎么写(C语言)
java·前端·javascript