2010-04-29 132 views
3

父母有幾個子線程。C#如何殺死父線程

如果用戶點擊停止按鈕,父線程應該被所有子線程終止。

//calls a main thread   
mainThread = new Thread(new ThreadStart(startWorking)); 
mainThread.Start(); 
//////////////////////////////////////////////// 
    startWorking() 
{ 
    ManualResetEventInstance     = new ManualResetEvent(false); 
    ThreadPool.SetMaxThreads(m_ThreadPoolLimit, m_ThreadPoolLimit); 

    for(int i = 0; i < list.count ; i++) 
    {   

     ThreadData obj_ThreadData = new ThreadData(); 
     obj_ThreadData.name  = list[i]; 

     m_ThreadCount++;    

     //execute 
     WaitCallback obj_waitCallBack = new WaitCallback(startParsing); 

     ThreadPool.QueueUserWorkItem(obj_waitCallBack, obj_ThreadData); 
    } 
    ManualResetEventInstance.WaitOne(); 
} 

我想殺死mainThread。

+1

你想做什麼?如在,你是什麼產生的線程? – 2010-04-29 13:09:56

回答

2

你肯定是不要想要殺死這裏的任何線程,因爲(除其他原因外)問題中的「子線程」全部來自線程池。

請參閱this article關於如何創建和終止線程。

在你的情況,你有多個線程都在使用startParsing方法。假設這個方法有一個循環,你可以創建一個叫做_stillWorking的類級別爲bool的東西,並在startWorking方法的開始處將其設置爲true

startParsing的循環內,您每次都檢查_stillWorking是否爲true。要「取消」所有這些線程,則只需將_stillWorking設置爲false並等待線程完成。

9

一般建議:不要殺死線程(請參閱,例如Killing a thread)。有各種各樣令人討厭的資源泄漏和數據腐敗風險。

讓線程很好地表現出來,並讓它們在發送信號時完成工作,而不是通過任何您喜歡的IPC機制。

我不記得.NET API識別父和子線程。這會使你的關係成爲你追蹤的責任。

2

您可能會考慮將請求從子線程退出並傳遞給父級,然後在那裏處理它。我想你會發現整體上更簡單。