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

joe*_*not 2 c# multithreading asynchronous .net-4.0 task-parallel-library

我正在解释发生了什么.

//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);
}
Run Code Online (Sandbox Code Playgroud)

称如下:

//loop 10 times
Parallel.For(1, 11, p => DoWorkAsync()); 
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.这些任务会按预期延迟大约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);
}
Run Code Online (Sandbox Code Playgroud)

即我删除了async/await关键字,并使用类似的方式调用

Parallel.For(1, 11, p => DoWork());
Run Code Online (Sandbox Code Playgroud)

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

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

希望一些TPL大师能够解释发生了什么!

Jon*_*eet 8

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

好吧,你不能这样做没有用它的东西,结果.Task.Delay只返回稍后将完成的任务.就是这样.它本身并没有对当前线程"做"任何事情.await然后使用then调度回调以在该任务完成时执行其余的异步方法,并在安排回调后将控制权返回给调用者.

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