2012-03-06 98 views
6

我在VS 2010中使用C#.Net4.0。 如何重新啓動Thread如何在C#.Net 4.0中重新啓動線程?

它就像我想Abort()的線程和Start()它從一開始呢? 這可能嗎?

+1

一般來說,'Abort()'線程是一個壞主意。你想解決什麼問題? – Heinzi 2012-03-06 10:23:49

+0

這可以幫助你: - [重新啓動在C#4.0中的線索] [1] [1]:http://stackoverflow.com/questions/1054889/restarting-a-thread-in-net- using-c – Misam 2012-03-06 10:25:00

+0

停止和啓動線程的要求有點不尋常 - 您嘗試解決什麼問題? – dice 2012-03-06 10:35:43

回答

7

創建線程的新實例並再次執行。 thread1 = new Thread(); thread1.start();

7

中止一個線程往往是一個壞主意。他是一名顧問。如果它是一個無限循環,則用於在沒有墮胎的情況下停止線程的布爾值。

bool run = true; 
Thread thread = new Thread(method); 
thread.start(); 

private void method() 
{ 
    while(run) 
    { 

    } 
} 

停止線程,只需設置布爾爲false,通常情況下,你可以重新啓動它。

+1

很好的建議。 'run'應該是'volatile',以避免由於編譯器優化造成的無限期等待。 – Tudor 2012-03-06 10:34:25

+1

考慮使用'lock',特別是在設置布爾值時。更好的是,將它與'monitor'結合使用。看看這裏:http://stackoverflow.com/questions/1559293/c-sharp-monitor-wait-pulse-pulseall#1559662 – 2012-03-06 10:44:43

+0

當我點擊創建服務器時,我的線程函數開始。它執行一些初始化,然後進入包含socket.Accept()的無限循環。控制卡在這個語句,所以我不能使用這種鎖定方法。 – Shashwat 2012-03-06 12:57:00

2

Thread.Abort不保證線程會終止。例如,如果您有一個長時間運行的查詢,則Abort不會終止查詢的執行或取消該線程。事實上,線程將一直持續到查詢完成。

如果您在託管代碼中執行所有操作並且未被非託管資源鎖定,並且必須中止一個線程,那麼thread.Abort()就完全正確。

但是,您不能在已終止的線程上調用Start。您必須創建另一個線程並在該線程上調用Start。在.NET中(與其他語言相比),創建線程有點昂貴,內存明智,所以存在一些缺點。

+0

實際上一次又一次地創建線程不會太昂貴,因爲它不會非常頻繁地完成。 – Shashwat 2012-03-06 12:58:52

1

當您想要從頭開始重新啓動線程時,您實際上想要重新啓動線程上的某個函數(代碼流)的執行。當你創建一個線程並傳遞一個執行函數時,一旦函數完成它自己的執行,線程的生命就會終止。你只需要改變你的代碼設計,這將允許重新啓動一個新的線程重新啓動函數。 但是對於簡短的功能,我建議使用ThreadPool

1

由於您正在使用.NET 4.0,其中MS引入了「合作取消框架」。你可以從這個blog瞭解更多。 直接處理線程是(越來越不鼓勵)。