Task.Factory.StartNew方法是否可能永远不会完成执行?

时间:2014-08-23 02:07:16

标签: c# multithreading

StartNew方法是否可能永远不会完成执行?

例如,在下面的程序中,如果不知道Method1或Method2中的代码,是否可能永远不执行Console.WriteLine("Tasks Created!");调用,并且该程序无限期地继续运行而不退出?

using System;
using System.Threading.Tasks;
using MyMethods;

class Program
{
   static void Main(string[] args)
   {
      var one = Task.Factory.StartNew(() => Methods.Method1());
      var two = Task.Factory.StartNew(() => Methods.Method2());
      Console.WriteLine("Tasks Created!");
   }
}

如果是这样,会导致什么原因?

1 个答案:

答案 0 :(得分:3)

除非出现严重错误,否则StartNew会立即返回。因此,您的应用将显示“已创建的任务!”然后退出,可能在Method1Method2完成执行之前(很可能在他们甚至开始执行之前)。

当然,可能可能会出现严重错误,并阻止您的代码进入WriteLine来电。有人可能已经用错误的实现替换了默认的TaskScheduler。堆可能以引入疯狂行为的方式被破坏。 JIT编译器中可能存在一个模糊的死锁。由于恶意软件和/或超频CPU,计算机可能会出现问题。其中一个任务可以在主线程上调用SuspendThread。有人可以附加调试器,在断点处停止,并且永远不会继续。用你的想象力。

但除非您准备推理total breakdown of normal functioning,否则您可以放心地假设StartNew将对任务进行排队,然后返回。