gpt4 book ai didi

c# - 如果我仍然使用 TaskCompletionSource 来实现异步,我应该返回 ValueTask 吗?

转载 作者:行者123 更新时间:2023-12-03 18:39:56 25 4
gpt4 key购买 nike

如果我使用 ValueTask 来实现实际的异步,返回 TaskCompletionSource 是否还有好处?
据我了解, ValueTask 的目的是减少分配,但在等待 TaskCompletionSource.Task 时分配仍然存在。这是一个简单的例子来说明这个问题。我是否应该从 Task 返回 ValueTask (相对于 DispatcherTimerDelayAsync ),它本身总是被期望是异步的?

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();
}
}

最佳答案

各有利弊。在“亲”栏中:

  • 同步返回结果(即 Task<T> )时,使用 ValueTask<T> 可避免分配任务 - 但是,此 不会将 应用于“void”(即非通用 Task ),因为您可以只返回
  • o
  • 当您发出多个顺序等待项时,您可以使用带有顺序标记的单个“值任务源”来减少分配

  • (“2”的特殊情况可能是通过 Task.CompletedTask 等工具进行摊销)
    感觉这两者都不适用于这里,但是:如果有疑问,请记住将 PooledAwait 作为 Task ( ValueTask ) 返回是无需分配的,这将允许您考虑将实现更改为无需分配稍后,没有破坏签名。当然,您仍然需要为原始的 return new ValueTask(task); 等付费 - 但将它们公开为 Task 不会增加任何额外费用。
    老实说,我不确定在这种情况下我是否会为此担心太多,因为延迟是一种分配方式。

    关于c# - 如果我仍然使用 TaskCompletionSource 来实现异步,我应该返回 ValueTask 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62788515/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com