如果我使用 TaskCompletionSource
实现实际异步,那么返回 ValueTask
还有好处吗?
据我所知,ValueTask
的目的是减少分配,但是当等待 TaskCompletionSource.Task
时仍然存在分配。以下是一个简单的示例来说明这个问题:
async ValueTask DispatcherTimerDelayAsync(TimeSpan delay)
{
var tcs = new TaskCompletionSource<bool>();
var timer = new DispatcherTimer();
timer.Interval = delay;
timer.Tick += (s, e) => tcs.SetResult(true);
timer.Start();
try
{
await tcs.Task;
}
finally
{
timer.Stop();
}
}
我应该更倾向于从
DispatcherTimerDelayAsync
返回 Task
而不是 ValueTask
,因为它本身总是期望异步的。
await Task.Delay(delay);
。我的理解是否正确? - Tanveer Badarasync
,改为return Task.Delay(delay);
:能进一步减少分配内存的情况! - Marc GravellTaskCompletionSource
来完成。 - avo