任务.延迟(0)不是异步的
本文关键字:异步 延迟 任务 | 更新日期: 2023-09-27 18:19:40
我有以下代码(是的,我可能正在模拟JavaScript setTimeout
api)
async void setTimeout(dynamic callback, int timeout)
{
await Task.Delay(timeout);
callback();
}
看起来对于timeout > 0
,setTimeout
异步工作,其中控制返回到await
上的callee
,并且在任务异步运行后调用callback
BUT当timeout == 0
时,函数以同步方式运行(代码总是在没有上下文切换的情况下通过同一线程中的等待行运行)。在进一步的挖掘中,发现Task.Delay
是以这种方式实现的(Task.Filder()与Task.Delay(0))
想知道是否有一种方法可以使Task.Delay(0)异步,或者当timeout
是0
时,是否有另一种解决方案可以使我的setTimeout
异步运行?(这样我就可以模仿JavaScriptsetTimeout
功能)我看到了关于使用Task.FromResult(true)
或Task.WhenAll
的讨论,但它们似乎不起作用。
事实上,我可以用Task.Delay(1)
代替Task.Delay(0)
,但它看起来并不有机。
Task.Delay(0)
不异步运行的原因是异步等待状态机明确检查任务是否完成,如果完成,则同步运行。
您可以尝试使用Task.Ielder(),这将强制该方法立即返回,并在当前SynchornizationContext
上恢复该方法的其余部分。例如:
async void setTimeout(dynamic callback, int timeout)
{
if(timeout > 0)
{
await Task.Delay(timeout);
}
else
{
await Task.Yield();
}
callback();
}