如何在不使用await的情况下释放包装副作用的ValueTask?
无返回值ValueTask的复用标记方法
当你持有一个无返回值的ValueTask(非ValueTask<T>),且它已同步完成(IsCompletedSuccessfully为true)、尚未被await时,可通过以下方式告知运行时该实例已被使用,以便底层基于IValueTaskSource实现的资源被安全复用:
- 调用
valueTask.AsTask():该方法会完成对ValueTask的消费逻辑,无论它是基于普通Task还是IValueTaskSource实现,调用后原ValueTask即可被安全复用(若支持复用)。 - 直接执行
await valueTask;:即便ValueTask已同步完成,await操作也会正确标记它已被使用,且不会产生额外异步开销——同步完成的ValueTask在await时会直接执行后续代码路径。
注意:绝对不能直接丢弃未处理的ValueTask,尤其是当它基于IValueTaskSource实现时,会导致资源无法回收或复用,甚至引发后续使用时的异常。
内容的提问来源于stack exchange,提问作者Boris B.
相关产品推荐
相关产品推荐

