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

是否必须等待ValueTask?未等待会引发问题吗?

不等待ValueTask会引发问题吗?

完全不等待ValueTask是安全的,不会触发规范里禁止的状态机复用问题,具体解释如下:

  • 官方规范限制的是多次等待ValueTask——在真正异步的场景下,完成后的状态机可能被池化复用,多次等待会导致状态混乱、结果错误。但完全不等待的情况不在这个限制范围内:状态机要么在异步操作完成后正常返回池,要么如果未完成就被丢弃,底层的Task或IValueTaskSource会被GC正常处理,不会出现资源泄漏或状态异常。
  • 针对你给出的示例代码:SomeValueTask()返回的ValueTask即使不等待,内部的Task.Delay(1s)依然会正常执行完毕。完成后,编译器生成的状态机如果是池化的,会被正确回收复用;没等待只是没获取结果,不会干扰状态机的生命周期管理。

不过有个小提醒:如果是自定义的IValueTaskSource实现,且内部持有需要手动清理的非托管资源,那最好还是等待ValueTask完成,确保资源被正确释放。但对于标准的async ValueTask方法(比如你示例里的这种),完全不用操心这个,编译器生成的逻辑会自动处理好资源清理。

示例代码:

async Task IsThisLegal()
{
  var _ = SomeValueTask();
  await Task.Delay(10);
  // 此时ValueTask应已完成,但我们并未等待它,这样可行吗?
}

async ValueTask<bool> SomeValueTask()
{
  await Task.Delay(TimeSpan.FromSeconds(1));
  return true;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:52:05