2011-04-07 72 views
0

我有相當一類使用TcpClient,在NetworkStream上旋轉Threadwhile (!streamReader.EndOfStream) {}。只要TCP連接打開並且沒有可用的數據讀取,EndOfStream將阻止執行,所以我不知道該怎麼做才能放棄線程外部的讀取。如何停止在NetworkStream上阻塞StreamReader.EndOfStream

由於EndOfStream阻止,(至少在我的測試它)的設置被稱爲stoptrue不會做多好獨自一個私有字段,所以我所做的就是以下幾點:

// Inside the reading thread: 

try 
{ 
    StreamReader streamReader = new StreamReader(this.stream); 

    while (!streamReader.EndOfStream) 
    { 
     // Read from the stream 
    } 
} 
catch (IOException) 
{ 
    // If it isn't us causing the IOException, rethrow 
    if (!this.stop) 
     throw; 
} 

// Outside the thread: 

public void Dispose() 
{ 
    // Stop. Hammer Time! 
    this.stop = true; 

    // Dispose the stream so the StreamReader is aborted by an IOException. 
    this.stream.Dispose(); 
} 

這是推薦的方法來中止從NetworkStream閱讀或有一些其他技術,我可以用來安全(但強制)處置一切?

回答

0

您應該中止的線程。由於您已經使用了try/catch,因此中止線程(導致異常)將被正常捕獲,並且您可以處理關閉流和其他內容的情況。

關於中止一個線程(許多人認爲這是一個永遠不會做的事情)的主要內容是線程何時放棄它,以及後果是什麼。如果我們能夠處理它,可以放棄一個線程。

+2

「由於您已經使用了try/catch,因此會中止線程(導致異常)將被正常捕獲」 - 對於ThreadAbortException,這不是真的。捕捉異常並不妨礙它傳播(就像大多數例外情況一樣)。您需要發出一個Thread.ResetAbort來停止進一步的傳播。 – 2011-04-07 10:51:59