You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C# 9.0与.NET Core 7.0中无性能损耗同步等待ValueTask的方法

在同步方法中无损耗等待ValueTask完成(C# 9.0/.NET Core 7.0)

针对同步方法中等待ValueTask完成且保留其性能优势的需求,以下是优化后的实现方案:

核心逻辑

ValueTask的优势在于避免不必要的Task分配,因此我们优先判断其是否已完成:若已完成则直接获取结果;若未完成,再转为Task进行带超时的阻塞等待,仅在必要时产生Task分配开销。

实现代码

带返回值版本

private static TResult SyncallyAwait<TResult>(Func<ValueTask<TResult>> getValueTask, TimeSpan timeout)
{
    using var cts = new CancellationTokenSource(timeout);
    var valueTask = getValueTask();

    // 已完成时直接获取结果,无额外Task分配
    if (valueTask.IsCompleted)
    {
        return valueTask.GetAwaiter().GetResult();
    }

    // 未完成时转为Task,利用内置的超时等待逻辑
    var task = valueTask.AsTask();
    try
    {
        task.Wait(cts.Token);
        return task.Result;
    }
    catch (OperationCanceledException)
    {
        throw new TimeoutException("操作超时,数据库未在预期时间内返回结果。");
    }
    catch (AggregateException ex)
    {
        // 解包聚合异常,抛出原始底层异常
        throw ex.InnerException ?? ex;
    }
}

无返回值版本

private static void SyncallyAwait(Func<ValueTask> getValueTask, TimeSpan timeout)
{
    using var cts = new CancellationTokenSource(timeout);
    var valueTask = getValueTask();

    if (valueTask.IsCompleted)
    {
        valueTask.GetAwaiter().GetResult();
        return;
    }

    var task = valueTask.AsTask();
    try
    {
        task.Wait(cts.Token);
    }
    catch (OperationCanceledException)
    {
        throw new TimeoutException("操作超时,数据库未在预期时间内返回结果。");
    }
    catch (AggregateException ex)
    {
        throw ex.InnerException ?? ex;
    }
}

方案优势

  1. 零额外开销(完成时):当ValueTask已完成(如缓存命中、本地计算场景),直接通过GetAwaiter().GetResult()获取结果,完全保留ValueTask的性能优势。
  2. 避免CPU空转:替代原方案的忙等待循环,使用Task.Wait(CancellationToken)实现阻塞等待,线程会进入休眠状态,不会浪费CPU资源。
  3. 正确的异常处理:解包AggregateException并抛出原始异常,同时正确捕获超时并抛出对应的TimeoutException。

原方案的性能问题

原代码中的空while循环属于忙等待,会持续占用CPU时间片,在高并发场景下会导致系统性能急剧下降,优化后的方案彻底解决了这一问题。

内容的提问来源于stack exchange,提问作者James Jonatah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:25:27