如何在不使用await的情况下释放包装副作用的ValueTask?

问题描述 投票:0回答:1

如果我有一个“无结果”

ValueTask
(如普通的
ValueTask
,而不是
ValueTask<T>
)已同步完成,使得
valueTask.IsCompletedSuccessfully
为真。
ValueTask
尚未被
await
编辑。我如何告诉运行时我已经完成了
ValueTask
,并且如果它碰巧有
IValueTaskSource
支持,它可以被重用?

ValueTask<T>
具有
Result
属性,访问它(大概)会将
ValueTask<T>
标记为已消耗,但普通的
ValueTask
没有
Result

c# asynchronous async-await valuetask ivaluetasksource
1个回答
0
投票

您可以通过在任务上调用

IValueTaskSource
ValueTask
方法来通知底层
.GetAwaiter()
对象
.GetResult()
已被消耗:

if (valueTask.IsCompletedSuccessfully)
{
    valueTask.GetAwaiter().GetResult();
}

此调用不会导致任何分配。

ValueTaskAwaiter
是一个结构体。

注意: 在任务完成之前调用

.GetAwaiter().GetResult()
对于
ValueTask
来说不是有效的操作。还禁止多次调用
.GetAwaiter().GetResult()
,或与任何其他消耗操作(如
await
AsTask
)同时调用。这些限制记录在 ValueTask 结构的
Remarks
部分。

© www.soinside.com 2019 - 2024. All rights reserved.