gpt4 book ai didi

c# - Task.Delay(0) 不是异步的

转载 作者:太空狗 更新时间:2023-10-29 17:43:07 25 4
gpt4 key购买 nike

我有以下代码(是的,我可以模拟 JavaScript setTimeout api)

    async void setTimeout(dynamic callback, int timeout)
{
await Task.Delay(timeout);
callback();
}

对于 timeout > 0 来说,setTimeout 异步工作,其中控制在 await 时返回给 callee callback 在任务异步运行后调用。 但是timeout == 0 时,该函数以同步方式运行(代码始终在同一线程中运行经过 await 行而无需上下文切换)。在进一步挖掘中,结果是 Task.Delay 被实现为以这种方式运行 (Task.Yield() versus Task.Delay(0))

想知道是否有办法使 Task.Delay(0) 异步或替代解决方案使我的 setTimeout 函数在 timeout0< 时异步? (这样我就可以模仿 JavaScript setTimeout 功能)我看到关于使用 Task.FromResult(true)Task.WhenAll,但它们似乎不起作用。

我确实可以使用 Task.Delay(1) 而不是 Task.Delay(0) 但它看起来不太自然。

最佳答案

Task.Delay(0) 不异步运行的原因是因为 async-await 状态机明确检查任务是否完成,如果完成,则同步运行。

您可以尝试使用 Task.Yield() ,这将强制该方法立即返回并在当前 SynchornizationContext 上恢复该方法的其余部分。例如:

async void setTimeout(dynamic callback, int timeout)
{
if(timeout > 0)
{
await Task.Delay(timeout);
}
else
{
await Task.Yield();
}

callback();
}

关于c# - Task.Delay(0) 不是异步的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33407007/

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