根据文件ValueTask<TResult>
... _
提供包装 a
Task<TResult>
和 a的值类型TResult
,仅使用其中一个。
我的问题是关于 C# 编译器在async
遇到关键字时生成的状态机。当结果立即可用时,生成ValueTask<TResult>
包装 a 的a 是否足够聪明,或者当结果出现在 a 之后时生成包装 a ?这是一个例子:TResult
Task<TResult>
await
static async ValueTask<DateTime> GetNowAsync(bool withDelay)
{
if (withDelay) await Task.Delay(1000);
return DateTime.Now;
}
static void Test()
{
var t1 = GetNowAsync(false);
var t2 = GetNowAsync(true);
}
调用GetNowAsync(false)
应该返回一个TResult
包装器,因为没有等待,调用GetNowAsync(true)
应该返回一个Task<TResult>
包装器,因为Task.Delay
在结果可用之前等待 a。我担心状态机总是返回Task
包装器的可能性,从而抵消了该ValueTask
类型的所有优点Task
(并保留了所有缺点)。据我所知,该类型的属性ValueTask<TResult>
没有提供关于它内部包装的指示。我将上面的代码粘贴到了sharplab.io,但输出也没有帮助我回答这个问题。