任务.延迟(0)不是异步的

本文关键字:异步 延迟 任务 | 更新日期: 2023-09-27 18:19:40

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

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

看起来对于timeout > 0setTimeout异步工作,其中控制返回到await上的callee,并且在任务异步运行后调用callbackBUTtimeout == 0时,函数以同步方式运行(代码总是在没有上下文切换的情况下通过同一线程中的等待行运行)。在进一步的挖掘中,发现Task.Delay是以这种方式实现的(Task.Filder()与Task.Delay(0))

想知道是否有一种方法可以使Task.Delay(0)异步,或者当timeout0时,是否有另一种解决方案可以使我的setTimeout异步运行?(这样我就可以模仿JavaScriptsetTimeout功能)我看到了关于使用Task.FromResult(true)Task.WhenAll的讨论,但它们似乎不起作用。

事实上,我可以用Task.Delay(1)代替Task.Delay(0),但它看起来并不有机。

任务.延迟(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();
}