2010-03-03 4 views
0

서버에 소켓을 열고 동기식으로 데이터를 읽는 스레드를 사용하여 TCP 클라이언트를 구현했습니다. String thisLine = aReadStream.ReadLine(); 블록이 소켓에서 읽을 데이터가 없기 때문에 스레드를 죽이기 위해 Thread.Abort을 수행하려고합니다 (해당 ReadLine()에서 차단되어 있기 때문에) ThreadAbortException그러나을 잡을 수 있기를 기대합니다. 나는 할 수 없다.ThreadAbort가 소켓에서 readline과 함께 작동하지 않습니다.

스레드는 ReadLine()에 차단되어 있으며 죽지 않습니다. 내 스레드에서 사용중인 코드 아래에.

왜 내가 뭘 잘못하고 있으며 ReadLine() 차단을 해제하려면 어떻게해야하는지 알고 있습니까?

 
private void readSocket_andTriggerEvents() 
{    
    TcpClient aClient = null;   

    try 
    { 
     aClient = new TcpClient(); 
     aClient.Connect(_HOST, _PORT); 
     Trace.WriteLine("Socket Connected"); 

     NetworkStream aStream = aClient.GetStream(); 
     StreamReader aReadStream = new StreamReader(aStream); 
     int nTimes = 0; 

     while (this.isSocketThreadStarted) 
     { 

      String thisLine = aReadStream.ReadLine(); // when no data 
      // is available the application hangs here. 
      // Thread.Abort doesn't work! 
      } 
    }     
    catch (ThreadAbortException ex) 
    { 
     Trace.WriteLine("The Thread was brute-forced killed"); 
     // I never come here!! 
    } 
    catch (SocketException ex) 
    { 
     Helper.ShowErrorMessage(ex); 
    } 
    finally{ 
     aClient.Close(); 
     Trace.WriteLine("socket closed"); 
    } 

} 

답변

2

다른 스레드에서 소켓을 닫습니다. ReadLine이 차단되면 SocketException이 throw됩니다.

+0

도움 주셔서 감사합니다. 아직도 주위에 있다면 한 가지 더 : 내가 예상대로 ThreadAbortException이 throw되지 않는 이유를 알고 있습니까? –

+0

@Abruzzo Forte e Gentile : 죄송합니다. 그러나 Thread.Abort를 사용하는 것은 어쨌든 권장하지 않습니다. – dtb

+0

예.하지만이 시나리오에서는 비동기 소켓을 사용하지 않기 때문에 제가 할 수있는 유일한 방법입니다. 처음에는 .Abort()를 호출 한 다음 _socket.Close()를 호출하면 우연히 발견했습니다. ThradAbortExcepion을 catch 할 수 있습니다. 큰 도움을 주셔서 감사합니다! Ciao –

0

네트워크 스트림에는 StreamReader을 사용하지 마십시오. 그것은 단지 무한한 시내에서 잘 작동하지 않습니다. 스레드가 WaitSleepJoin 상태 또는 이와 유사한에서 어느 때 Thread.Abort에만 작동 - Thread.Abort이 작동하지 않는 이유에 대해서는

, 그건 정말 간단합니다. 스레드가 실행중인 경우 이 관리되는 코드로 표시됩니다. 차단 소켓 호출은 비 관리 코드에서 실행 (/ 차단) 될 가능성이 높으므로 Abort은 반환 될 때까지 작동하지 않습니다. 스레드를 "죽이는"방법은 없습니다. 안전하게 죽일 수있는 가장 작은 것은 프로세스입니다. 물론입니다

Thread.Abort 당신이 나중에 소켓을 닫으면 마술 작업 시작 - 스레드 차단을 해제하고 다시 Thread.Abort가 해키 마술을 할 수있는 관리 코드로 이동을 유발.

관련 문제