2012-05-14 42 views
3

開始通過該代碼會告訴你我是如何開始的多線程:如何停止多線程的循環條件

for (int i = 0; i < 8; i++) 
{ 
    doImages = new DoImages(this, TCPPORT + i); 
    var thread = new Thread(doImages.ThreadProc); 
    thread.Name = "Imaging"; 
    var param = (i + 1).ToString();      
    thread.Start(param); 
} 

現在我想要關閉我的應用程序之前停止線程,但我不知道如何要做到這一點?

+0

您需要保留一個跟蹤類內線程的對象。爲你的類實現一個Dispose方法來殺死跟蹤的線程,你應該沒問題。 – JamieSee

+1

'現在我試圖在關閉應用程序之前停止線程,但我不知道該怎麼做? - 你有沒有試過阻止它們?如果你不阻止他們,不要打電話給Thread.Join(),不要讓他們停下來,不要做任何事情? –

回答

2

一個簡單的選擇是引用存儲所有你產卵,然後加入全部的線程,當你完成:

Thread[] threads = new Thread[8]; 
for (int i = 0; i < 8; i++) 
{ 
    doImages = new DoImages(this, TCPPORT + i); 
    var thread = new Thread(doImages.ThreadProc); 
    threads[i] = thread; 
    thread.Name = "Imaging"; 
    var param = (i + 1).ToString();      
    thread.Start(param); 
} 
for (int i = 0; i < 8; i++) 
{ 
    threads[i].Join(); 
} 

這將等待所有線程的應用程序之前完成終止。

+0

感謝您的回覆。不是所有的代碼都成功了,但是我使用你的線程數組理想地通過循環遍歷每個線程項來阻止我的線程。並創建DoImages類的數組來停止它。 – TuanTDA

0

如果您保留對線程對象的引用並只想退出應用程序,則可以使用thread.Abort();

我的猜測是你想完成執行然後關閉應用程序。爲此,您需要使用Join()或其他同步方法同步您的線程。

+0

但通常應避免使用Thread.Abort()。由於這是關於退出過程,所以可以使用它。 –

2

最清潔和最可靠的方法是使它們後臺線程:當過程(主線程)在退出

for (int i = 0; i < 8; i++) 
{ 
    doImages = new DoImages(this, TCPPORT + i); 
    var thread = new Thread(doImages.ThreadProc); 
    thread.Name = "Imaging"; 
    var param = (i + 1).ToString(); 
    thread.IsBackground = true;   // ** 
    thread.Start(param); 
} 

背景線程自動終止。