任务并行库 - Task.Delay() 用法

Task Parallel Library - Task.Delay() usage

我正在对发生的事情进行一些解释。

//VERSION: Async
private async void DoWorkAsync()
{
    Stopwatch stpWatch = new Stopwatch();
    _logger.WriteToLog("Doing some work...etc + ThreadID=" + Thread.CurrentThread.ManagedThreadId);
    stpWatch.Start();

    await Task.Delay(5000);

    stpWatch.Stop();
    _logger.WriteToLog("Work finished on ThreadID=" + Thread.CurrentThread.ManagedThreadId + " ElapsedTime:" + stpWatch.ElapsedMilliseconds);
}

调用如下:

//loop 10 times
Parallel.For(1, 11, p => DoWorkAsync()); 

到目前为止一切顺利。任务确实按预期延迟了大约 5 秒。 (尽管 Parallel.For 循环如预期的那样提前完成)。

但是,如果我编写上述方法的同步版本:

//VERSION: Synchronous
private void DoWork()
{
        Stopwatch stpWatch = new Stopwatch();
        _logger.WriteToLog("Doing some work...etc + ThreadID=" + Thread.CurrentThread.ManagedThreadId);
        stpWatch.Start();

        Task.Delay(5000);

        stpWatch.Stop();
        _logger.WriteToLog("Work finished on ThreadID=" + Thread.CurrentThread.ManagedThreadId + " ElapsedTime:" + stpWatch.ElapsedMilliseconds);
}

即我删除了 async/await 关键字,并使用

进行类似调用
Parallel.For(1, 11, p => DoWork());

,没有像以前那样的 5 秒延迟,任务几乎立即完成(由我的日志文件验证)。

Task.Delay语句在后一种情况下似乎没有效果,我可以不使用 await 关键字吗?

希望有 TPL 大师能够解释一下这是怎么回事!

这是因为您不再等待延迟,处理会继续进行。事实上,这样你就不会再有延迟了。

您需要将 task.delay 替换为 Thread.Sleep。

The Task.Delay statement seems to have no effect in the latter case, can i not use it without await keyword?

好吧,如果不对结果做 一些事情,就不能使用它。 Task.Delay只是returns一个稍后会完成的任务。这就是它所做的一切。它本身不会对当前线程 "do" 任何内容。然后使用 await 安排回调以在该任务完成时执行异步方法的其余部分,并在安排回调后 returns 将控制权交给调用方。

如果您正在寻找 Task.Delay 的同步等价物,那基本上是 Thread.Sleep

Task.Delay() 创建一个在给定时间后完成的任务。您刚刚创建了一个任务,并且完成得非常快。

使用

Task.Delay(5000).Wait();

这是因为您需要等待任务完成才能继续。