【发布时间】:2020-04-16 17:55:14
【问题描述】:
这里提出的问题与one here 相同,旨在为它创建一个明确的解决方案。 最准确的答案是 Stephen Toub 本人在this issue 中提出的,这正是这个问题。 “推荐代码”如下:
public static ValueTask AsValueTask<T>(this ValueTask<T> valueTask)
{
if (valueTask.IsCompletedSuccessfully)
{
valueTask.GetResult();
return default;
}
return new ValueTask(valueTask.AsTask());
}
这个答案不是最新的——ValueTask 没有公开 GetResult()(只有 Result 属性)——问题是:
- 我们是否需要从 ValueTask 中“拉”出 Result(以“释放”可能在此 ValueTask 下运行的 IValueTaskSource)?
- 如果是:
- 是上面缺少的
.GetAwaiter()调用吗? - 或者是一个假电话保证工作
var fake = valueTask.Result;属性?总是? (我害怕死代码消除。)
- 是上面缺少的
- 如果不是,像下面这样的直接实现是否足够(并且是最佳的)?
public static ValueTask AsNonGenericValueTask<T>( in this ValueTask<T> valueTask )
{
return valueTask.IsCompletedSuccessfully ? default : new ValueTask( valueTask.AsTask() );
}
【问题讨论】:
标签: c# .net async-await valuetask