gpt4 book ai didi

c# - 内联任务何时发生?

转载 作者:太空狗 更新时间:2023-10-30 00:00:20 25 4
gpt4 key购买 nike

在从 here 等来源阅读了 TPL 中的内联之后,我的印象是调用 Task.Wait() 将启动尚未开始的任务(至少使用默认调度程序)。但是,编写一个快速演示,例如:

var taskB = new Task(
() =>
{
Console.WriteLine("In TaskB");
System.Threading.Thread.Sleep(5000);
Console.WriteLine("Leaving TaskB");
});

var taskA = new Task(
() =>
{
Console.WriteLine("In TaskA");
System.Threading.Thread.Sleep(500);
Console.WriteLine("Waiting on TaskB");
taskB.Wait();
Console.WriteLine("Leaving TaskA");
});

taskA.Start();
taskA.Wait();

导致死锁。 TaskA 到达 taskB.Wait() 行,但 taskB 从未启动。我没有弄乱调度程序或任何东西,所以我不太确定为什么 taskB 上的 .Wait() 调用不会导致它启动。

最佳答案

Wait() 不会导致任务Start()。如果您在未启动的任务上调用 Wait(),它将等待它开始并完成,直到它完成、等待超时或等待被取消。由于您对 Wait() 的调用不包含取消标记或超时,因此任务完成是无限期的。

我认为博客中让您感到困惑的是这一行:

However, if it hasn’t started executing, Wait may be able to pull the target task out of the scheduler to which it was queued and execute it inline on the current thread.

这里的关键是“还没有开始执行”这句话。这并不意味着未调用 Start(),而是调用了 Start() ,它会安排任务并使其准备好执行,但任务还没有开始执行。

Start() 是安排任务执行所必需的,它不会立即开始执行。这就是那个广告的要点。如果任务已准备就绪但未安排,则可能是内联的。但它不会启动甚至还没有安排的任务。

如果您查看 MSDN (See here) 中的 TaskStatus,您会看到以下值:

  • 创建
  • 等待激活
  • 等待运行
  • 运行
  • 等待 child 完成
  • 随机完成
  • 取消
  • 有问题

当您创建任务(使用 new 或 factory)时,它处于 Created 状态。在此状态下,任务不会发生任何事情。一旦启动,它就会移动到 WaitingForActivation 等等,在这一点上,直到它到达 Running,根据该博客,它可能是内联的。

所以,长话短说,创建任务只是将其置于已创建 状态,如果调用 Wait() 则不会启动它。有道理吗?

关于c# - 内联任务何时发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8405877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com