我正在解释发生了什么。
//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专家能够解释发生了什么!
答案 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();
这是因为您需要等待任务完成才能继续。