【发布时间】:2019-02-27 03:11:58
【问题描述】:
这是一个非常微妙的问题,但我的好奇心占了上风,我无法在文档或 SO 的其他地方找到答案。
Task.Wait(int millisecondsTimeout) 的文档说:
等待任务在指定的毫秒数内完成执行。
返回:
true如果任务在分配的时间内完成执行;否则,false。
考虑一下这个sn-p:
Task task = Task.Run(() => {
Thread.Sleep(2000);
});
task.Wait(1000);
当我调用Task.Wait(...) 时,超时倒计时是立即开始,还是Wait(...) 首先等待任务真正开始运行,然后才开始倒计时? (Task.Run(...) 仅使 Task 有资格运行。并不保证它确实已启动)
例如,如果线程池中的所有线程都在使用,并且线程池必须延迟 0.5 秒才能为我的队列任务创建新线程,我的 Wait(1000) 调用是否会在整秒,还是 0.5 秒后?
如果我猜的话,我会说Wait(...) 将在整整一秒后返回,但我想确定一下。
【问题讨论】:
-
看起来这对你来说很容易测试。
-
@JohnWu 我创建了一个小测试,但结果很奇怪且不确定。不过,这并不像答案中的测试那么简单......
-
@pushkin 简单。等待你从未开始的任务。它要么达到超时并继续,要么永远不会超时,具体取决于它是哪个选项。
-
@Servy 你的意思是使用
Task构造函数并且从不调用Start?我对您调用Start(或Run)的情况很感兴趣,但是由于线程池中的所有其他线程都忙,因此任务排队并延迟运行。 -
@Servy 虽然你的例子与我打算测试的有点不同,但它的结果确实回答了我的问题(见下面的答案)。谢谢
标签: c# multithreading task task-parallel-library wait