2014-02-25 72 views
0

我有一個(非常基本的understandig,因爲我認爲)的線程問題和中止這些:中止線程+插座連接

的情況是:我有一個線程工作的開放套接字連接 - 我現在中止線由thread.Abort()

問題是:套接字連接會發生什麼?它會被關閉和處置嗎?還是我必須自己照顧這個?

附錄:

線程是這裏創建:

foreach (Pcd pcd in LstPcds) 
     { 
      Thread.Sleep(delay); 
      Thread thread = new Thread(pcd.Simulate); 
      _lstActiveThreads.Add(thread); 
      thread.IsBackground = true; 
      thread.Name = pcd.ToString(); 
      thread.Start(); 
      count++; 
     } 

,應設置/中止/不管這裏:

public void DisposePcds() 
    { 
    try 
    { 
     foreach (Thread thread in _lstActiveThreads) 
     { 
      thread.Abort(); 
     } 
    } 
    catch (Exception exception) 
    { 
     MessageBox.Show(exception.ToString()); 
    } 
    } 

每個thread具有敞開Socket連接,如下所示:

// connecting (async) to the service 
// blocks the thread until connection is established 
ConnectionSocket = new Socket(_ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
ConnectionSocket.BeginConnect(_ipEndPoint, ConnectCallback, ConnectionSocket); 
_manualConnectEvent.WaitOne(); 

// begin receive data from the server 
ReceiveDto receive = new ReceiveDto { Socket = ConnectionSocket }; 
ConnectionSocket.BeginReceive(receive.Buffer, 0, ReceiveDto.GetBufferSize(), 0, ReceiveCallback, receive); 

加上定時器並且其中每個Socket發送一個字節數組其經過事件:

byte[] request = GetRegisterRequestCommand(bank); 
ConnectionSocket.Send(request, SocketFlags.None); 
+3

切勿使用'Thread.Abort()'。真。很少有任何有效的理由來使用它。你應該使用一種機制(比如'AutoResetEvent'等)來允許線程正常關閉。 –

+0

你能告訴我們零件嗎?在哪裏放棄線程並關閉連接? – Max

+0

套接字連接將不會自動關閉。你必須手動完成。顯示代碼有助於我們確定:) –

回答

1

只要閱讀關於這一主題的MSDN文檔。

首先,不,你的代碼永遠無法工作。一次性用品需要明確地呼叫.Dispose(),或者它們通過using(IDisposable){}的語法糖隱式調用。

現在看ThreadAbortException你可以捕捉異常(但它會被重新拋出)。所以using(它由編譯器轉換爲try{}finally{Dispose()})將工作。

但你沒有異常處理。

+0

謝謝阿隆 - 我知道這段代碼在我們的任何宇宙中都不起作用,但實際上這不是一個「真實」場景的問題,它只是作爲對「處理」線程的缺乏理解而發生的,其內部行爲起作用。 –