Task.Wait(int) 是在调用时立即开始等待,还是在任务启动时开始等待 运行?
Does Task.Wait(int) start waiting right when it's called, or when the Task starts running?
这是一个非常微妙的问题,但我的好奇心打败了我,我无法在文档或 SO 的其他地方找到答案。
Task.Wait(int millisecondsTimeout)
的文档说:
Waits for the Task to complete execution within a specified number of milliseconds.
它returns:
true
if the Task completed execution within the allotted time; otherwise, false
.
考虑这个片段:
Task task = Task.Run(() => {
Thread.Sleep(2000);
});
task.Wait(1000);
超时倒计时是在我调用 Task.Wait(...)
时立即开始,还是 Wait(...)
先等待任务真正开始 运行ning 才开始倒计时? (Task.Run(...)
仅使任务符合 运行 的条件。它不保证它实际启动)
例如,如果线程池中的所有线程都在使用中,并且线程池必须延迟 0.5 秒才能为我的排队任务创建新线程,我的 Wait(1000)
在整秒后或 0.5 秒后调用 return?
如果让我猜的话,我会说 Wait(...)
会在一整秒后 return,但我想确定一下。
根据我的阅读,您可以很容易地测试场景以自己找出答案,但我不确定我是否真的理解您的问题。也就是说,I 将如何测试它:
static void Main(string[] args)
{
Task task = new Task(() => WriteLine("task!"));
task.Wait(1000);
WriteLine("Done waiting");
}
果然,如果你运行上面的代码,你会发现即使你从未开始任务,对Wait()
的调用仍然会在1秒后过期。
换句话说,正如文档所说,该方法等待任务完成指定的时间,然后 returns。
鉴于 Wait()
方法将 return 即使任务甚至从未开始,如果任务已经开始但尚未给出,它也会 return有机会 运行 任何代码呢。听起来这就是你问的实际情况。
任务是否开始是无关紧要的(尽管在实践中,这些天我们几乎从来没有未开始的任务......良好的惯用 C# 编程实践规定你只能从 [=35] 的机制中获得 Task
对象=] 一个已经启动的任务,例如 Task.Run()
或调用 async
方法)。
或者这样看:如果你妈妈告诉你,"I'll serve dinner as soon as you're done cleaning your room, but no later than 30 minutes from now",你认为她会考虑你是否真的开始清洁你的房间有没有?不行,30分钟后她要上饭,无论如何。
.NET 也是如此。它不关心你是否开始任务,只关心它没有在规定的时间内完成。
这是一个非常微妙的问题,但我的好奇心打败了我,我无法在文档或 SO 的其他地方找到答案。
Task.Wait(int millisecondsTimeout)
的文档说:
Waits for the Task to complete execution within a specified number of milliseconds.
它returns:
true
if the Task completed execution within the allotted time; otherwise,false
.
考虑这个片段:
Task task = Task.Run(() => {
Thread.Sleep(2000);
});
task.Wait(1000);
超时倒计时是在我调用 Task.Wait(...)
时立即开始,还是 Wait(...)
先等待任务真正开始 运行ning 才开始倒计时? (Task.Run(...)
仅使任务符合 运行 的条件。它不保证它实际启动)
例如,如果线程池中的所有线程都在使用中,并且线程池必须延迟 0.5 秒才能为我的排队任务创建新线程,我的 Wait(1000)
在整秒后或 0.5 秒后调用 return?
如果让我猜的话,我会说 Wait(...)
会在一整秒后 return,但我想确定一下。
根据我的阅读,您可以很容易地测试场景以自己找出答案,但我不确定我是否真的理解您的问题。也就是说,I 将如何测试它:
static void Main(string[] args)
{
Task task = new Task(() => WriteLine("task!"));
task.Wait(1000);
WriteLine("Done waiting");
}
果然,如果你运行上面的代码,你会发现即使你从未开始任务,对Wait()
的调用仍然会在1秒后过期。
换句话说,正如文档所说,该方法等待任务完成指定的时间,然后 returns。
鉴于 Wait()
方法将 return 即使任务甚至从未开始,如果任务已经开始但尚未给出,它也会 return有机会 运行 任何代码呢。听起来这就是你问的实际情况。
任务是否开始是无关紧要的(尽管在实践中,这些天我们几乎从来没有未开始的任务......良好的惯用 C# 编程实践规定你只能从 [=35] 的机制中获得 Task
对象=] 一个已经启动的任务,例如 Task.Run()
或调用 async
方法)。
或者这样看:如果你妈妈告诉你,"I'll serve dinner as soon as you're done cleaning your room, but no later than 30 minutes from now",你认为她会考虑你是否真的开始清洁你的房间有没有?不行,30分钟后她要上饭,无论如何。
.NET 也是如此。它不关心你是否开始任务,只关心它没有在规定的时间内完成。