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大师能够解释发生了什么!
在后一种情况下,Task.Delay语句似乎没有效果,如果没有await关键字,我可以不使用它吗?
好吧,你不能这样做没有用它的东西,结果.Task.Delay只返回稍后将完成的任务.就是这样.它本身并没有对当前线程"做"任何事情.await然后使用then调度回调以在该任务完成时执行其余的异步方法,并在安排回调后将控制权返回给调用者.
如果你正在寻找同步的等价物Task.Delay,那基本上就是这样Thread.Sleep.