2011-03-22 34 views
1

在我的應用程序中我有一個父線程。我想知道如果我暫停執行父線程,子線程會發生什麼?他們會繼續執行還是會被暫停,並等待父線程恢復執行?請幫幫我。在c中的線程#

+0

您最好向我們展示一些代碼。 – Steven 2011-03-22 07:29:43

+0

你爲什麼想看代碼? – jgauffin 2011-03-22 07:32:00

回答

4

線程並沒有真正的父/子關係 - 一旦線程已經啓動,它就獨立於創建它的線程。我很擔心你對父主題使用「suspend」這個詞 - 雖然暫停一個主題通常是一個糟糕的主意,尤其是,如果你的意思是叫Thread.Suspend,你應該知道這已經被棄用了。你是什麼意思,如果你想在線程間協調工作,有更好的方法。)

示例代碼,顯示四個線程正在工作,正在暫停,正在恢復,然後進程終止:

using System; 
using System.Threading; 

public class A 
{ 
    static void Main() 
    { 
     // Start off unpaused 
     var sharedEvent = new ManualResetEvent(true); 

     for (int i = 0; i < 4; i++) 
     { 
      string prefix = "Thread " + i; 
      Thread t = new Thread(() => DoFakeWork(prefix, 
                sharedEvent)); 
      // Let the process die when Main finished 
      t.IsBackground = true; 
      t.Start(); 
     } 
     // Let the workers work for a while 
     Thread.Sleep(3000); 
     Console.WriteLine("Pausing");   
     sharedEvent.Reset(); 

     Thread.Sleep(3000);  
     Console.WriteLine("Resuming"); 
     sharedEvent.Set(); 

     Thread.Sleep(3000); 
     Console.WriteLine("Finishing"); 
    } 

    static void DoFakeWork(string prefix, ManualResetEvent mre) 
    { 
     while (true) 
     { 
      Console.WriteLine(prefix + " working..."); 
      Thread.Sleep(500); 
      mre.WaitOne(); 
     } 
    } 
} 
+0

我正在做一個巨大的計算在我的應用程序。我的應用程序有一個暫停按鈕。我希望我的應用程序暫停,如果some1點擊暫停按鈕,並恢復它的ececution如果點擊一下Resume按鈕。我的應用程序有一個父線程。在兩個不同的函數中,我已經在每個函數中啓動了4個線程。我正在使用線程池。 – 2011-03-22 07:38:42

+0

@Sanchaita:你應該暫停*合作*在每個工作線程內,定期檢查某個共享布爾值是否需要暫停。或者,您可以使用'ManualResetEvent',並定期等待 - 在暫停時重置它,並將其設置爲繼續。 – 2011-03-22 07:40:45

+0

我正在做WaitOne把我的所有線程在1點。我在哪裏應該實現它。在WaitOne之後或之前。我可以使用暫停 – 2011-03-22 08:13:44

2

線程在.Net中沒有真正的父子關係 - 所以掛起一個線程w生病不會暫停其他線程發生它已經創建。