2012-07-28 59 views
-2

當我單擊button應打印A S,但是當我點擊按鈕2需要停止線程1,需要啓動線程2,什麼是錯在這裏請大家幫我如何創建一個線程

private void button1_Click(object sender, EventArgs e) 
    { 
     if (thread2.IsAlive) 
     { 
      thread2.Suspend(); 
     } 
     thread1 = new Thread(threadOne); 
     thread1.Start(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     if (thread1.IsAlive) 
     { 
      thread1.Suspend(); 
     } 
     thread2 = new Thread(threadTwo); 
     thread2.Start(); 
    } 

    private void threadOne() { 
     for (int i=0; i < 20; i++) 
     { 
      Console.Write("A"); 
      Thread.Sleep(500); 
     } 
    } 

    private void threadTwo() 
    { 
     for (int i = 0; i < 20; i++) 
     { 
      Console.Write("B"); 
      Thread.Sleep(500); 
     } 
    } 

回答

1

有很多錯誤,因爲其他海報已經正確指出。我會補充一點:

1)商業級軟件中的大多數線程在應用程序的生命週期中從不終止 - 它們被寫爲無限循環,阻塞調用等待來自其他線程或I/O的某種信號操作。

2)持續創建/終止/銷燬線程對象的是昂貴的,難以控制,笨拙調試的,不可靠的,並且通常引起疼痛。

3)如果你的多線程代碼包含以下任一:

Suspend() 
Resume(), (except in some thread ctors) 
Join() 
Abort() 
IsAlive() 

你或許應該重新考慮:)

我知道你只是學習,但有時它是更好地修補孔他們得到之前的任何更大的:)

+0

非常感謝 – mssb 2012-07-28 17:55:51

+0

@mssb您應該通過點擊答案左上角的綠色勾號來接受答案(如果答案對您有幫助),因此它可以幫助未來的訪問者快速找到答案。 – nawfal 2012-07-29 08:13:17

1

你正在創建螺紋在按鈕單擊事件,使檢查threadX.IsAlive將拋出錯誤報告空引用異常if語句的實例

所以,請在負載創建的線程1 & 2實例

+0

謝謝您的建議 – mssb 2012-07-31 06:42:43

1

檢查null ALS O操作。 使用Abort()方法而不是Suspend(),因爲您每次都會創建一個新線程。

private void button1_Click(object sender, EventArgs e) 
    { 
     if (thread2!=null && thread2.IsAlive) 
     { 
      thread2.Abort(); 
     } 
     thread1 = new Thread(threadOne); 
     thread1.Start(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     if (thread1!=null && thread1.IsAlive) 
     { 
      thread1.Abort(); 
     } 
     thread2 = new Thread(threadTwo); 
     thread2.Start(); 
    } 
+0

非常感謝你它的工作 – mssb 2012-07-28 17:33:06

+0

Thread.Abort的是危險的。請參閱http://haacked.com/archive/2004/11/12/how-to-stop-a-thread.aspx或進行網絡搜索。 – 2012-07-28 17:59:50