2013-10-11 52 views
0

系统裂纹我有以下代码示例:与任务C#

class Program 
{ 
    static void Main(string[] args) 
    { 
     var a = true; 
     Task t = Task.Factory.StartNew(() => 
     { 
      a = getBoolean(); 
     }); 
     Task.Factory.StartNew(() => 
     { 
      Console.ReadLine(); 
     }); 
     while (!t.IsCompleted) 
     { 
      //Console.WriteLine("initial : a = {0}", a); 
     } 
     if (a == true) 
     { 
      Console.WriteLine("From system a = {0}", true); 
     } 
     else 
     { 
      Console.WriteLine("From system a = {0}", false); 
     } 
    } 

    public static bool getBoolean() 
    { 
     Task<bool> a = DelayTask(); 
     bool r = a.Result; 
     a.Dispose(); 
     return r; 
    } 

    public static Task<bool> DelayTask() 
    { 
     return Task.Factory.StartNew<bool>(() => 
     { 
      Thread.Sleep(30000); 
      return false; 
     }); 
    } 
} 

一旦我运行上述我的窗口此代码自动死亡。 (我必须按下笔记本电脑上的电源按钮)。有人可以帮助我重现这个问题,并为我解释为什么发生这种情况。

+0

单核系统?你正在等待。 – usr

+0

No..i在我的笔记本电脑中有4个核心 - 核心i3 – hoanganh17b

+0

一旦你按任意键...系统破解.. ???我不知道为什么。 – hoanganh17b

回答

0

的问题来自

while (!t.IsCompleted) 
{ 
    //Console.WriteLine("initial : a = {0}", a); 
} 

你正在做的循环内什么,这是导致单核的CPU使用率达到100%,如果你是一个单核的机器上这个最挑衅可能导致其锁起来。

在多核计算机上,它可能会导致显着的缓慢,但不应导致整个系统锁定。您的系统中可能还有其他问题,并且由此程序导致的散热或系统负载可能会导致计算机的其他部分失效,从而导致锁定。

快速的解决方案是把某种睡眠在那里释放CPU

while (!t.IsCompleted) 
{ 
    Thread.Sleep(100); //Sleep for 100ms for the next check 
} 

,甚至更好,更换

t.Wait(); 

整个循环但是还有许多其他的东西,你是这样做被认为是“不好的编码实践”,整个程序可能需要重新编写。

+0

谢谢@Scott Chamberlain。我只是尝试了解TPL的行为。但它太疯狂了,因为我认为我可以同时做2项任务。一 - Consoler.Readline()和其他做一些事情..? – hoanganh17b