任务并行库 - 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();
这是因为您需要等待任务完成才能继续。
我正在对发生的事情进行一些解释。
//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();
这是因为您需要等待任务完成才能继续。