是否必须等待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
相关产品推荐
相关产品推荐

