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

时间:2015-03-17 08:10:54

标签: 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);
}

如下所示:

//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专家能够解释发生了什么!

4 个答案:

答案 0 :(得分:8)

  

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

嗯,你不能使用 结果来使用它。 Task.Delay只返回稍后将完成的任务。这就是全部。它本身并没有 - "做"当前线程的任何内容。使用await然后调度回调以在该任务完成时执行其余的异步方法,并在安排回调后将控制权返回给调用者。

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

答案 1 :(得分:1)

原因是你不再等待延迟,处理就会继续。事实上,你不再有这样的延迟。

您需要使用Thread.Sleep替换task.delay。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用

Task.Delay(5000).Wait();

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