2013-10-11 85 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