2011-11-04 77 views
1

我正在使用線程來調用包含while循環來讀取權重的函數。在while循環中,我調用委託函數來更新文本框中的值。線程在C#中使用帶代理的線程中止異常

在點擊一個名爲Stop按鈕,我試圖中止線程,但我得到一個線程中止異常:

private System.Threading.Thread comm1; 
comm1 = new System.Threading.Thread(new System.Threading.ThreadStart(reading)); 
comm1.Start(); 

public void reading() 
{ 
    while(continus) 
    { 
    textBox1.Invoke(
        new PrintValueTextDelegate(PrintValueText), 
        new object[] { text Box, value.ToString() }); 

    for (int i = 0; i < risposta.Length; i++) 
    { 
     risposta[i] = 0; 
    } 

    if (_protocollo.Manda_TLC1(2, 0x70, risposta) == true) 
    { 
     if ((risposta[0] & 0x80) != 0x80) 
     { 
      cella = risposta[1] * 256 + risposta[2]; 
      string rt = cella.ToString(); 
     } 
     } 
    } 
} 

private void btnstop_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     continus = false;    
     System.Threading.Thread.Sleep(1000);    
     comm1.abort(); // wait for close foreground thread 
    } 
    catch (Exception rt) 
    { 
     MessageBox.Show(rt.ToString()); 
    }   
} 

上面的代碼我得到線程終止異常可以在任何一個請幫助我出了這個問題。

+2

幫我解決...... **爲什麼**你想要調用thread.abort?這是一種非常致命的方法......你有什麼具體的*試圖在這裏做? (「什麼」而不是「如何」) –

+0

Thread.Abort()通過設計引發異常,除了用try-catch塊隱藏它外沒有辦法繞過它 – Alex

+0

我試圖從連續讀取體重線程並在文本框中顯示重量。當重量校準結束時,我正在嘗試關閉它。 –

回答

1

變化

comm1.abort();// wait for close foreground thread 

comm1.join();// wait for close foreground thread 

abort立即停止線程,而join等待它完成。

+0

非常感謝你的幫助戴維肯普。這是工作 。 –

+0

但是當我嘗試再次讀取重量。在按下閱讀按鈕我得到「錯誤打開com1:ioexception」 –

1

你得到一個線程終止異常,因爲你是在告訴線程中止...

http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx(whcih是不是爲我工作的時刻,但我抓住了從谷歌的緩存文本)說:

調用Abort方法時引發的異常。

請注意,這並不是一個例外,表明您對Thread.Abort()的調用失敗,它是您正在中止的線程發出的異常:「我剛被中止!」。

如果您想要更優雅地停下來,請在停止調用時將您的while循環中的continus變量更改爲false。然後,while循環將停止運行,並且您的線程應該完成。

+0

謝謝你的克里你的寶貴建議。現在它正在工作 –

1

調用Thread.Abort()拋出一個線程中止異常,這是它的工作原理。

docs 「引發的線程一個ThreadAbortException上調用它」

1

使用CancellationTokenSource對線程發出取消操作。請注意,您的申請必須檢查是否已要求取消。 使用thread.Join等待一個線程退出。