2012-05-05 3 views
1

는이 같은 스레드를 가지고 :Thread.Sleep은 TCPListener를 비활성화합니까?

 Public Sub StartWork() 
     Try 
      myTCPListener.Start() 
      While StopRequest = False 
       Dim requestspending As Boolean = m_TCPListener.Pending() 
       If myTCPListener.Pending = False Then 
        Threading.Thread.Sleep(100) 
       Else 
        DoSomething() 
       End If 

      End While 
     Catch ex As Exception 
      Throw ex 
     End Try 
    End Sub 

이제 내 질문 : 나는 아무것도 여기에 일이 없을 때 슬립 모드로 Thread.sleep를 통해 스레드를 보냅니다. 이것은 어떻게 든 작업의 ​​TCPListener에 영향을 미치며 스레드가 절전 모드에있는 동안 연결되지 않은 연결은 어떻게됩니까?

+0

예. 코드가 이상합니다. 누군가가 연결하려고 할 때만 DoSomething을 사용합니다. 귀찮게하지 마시고 대신 AcceptSocket을 호출하십시오. 그러면 레코딩 코어를 피하기 위해 잠을 자지 않아도됩니다. –

+0

문제는 thread.sleep없이 프로그램을 실행하면 thread.sleep에서 내 CPU (amd x6 phenom)의 33 %를 차지하며 17 % 만 차지한다는 것입니다. 그래서 스레드가 연결을 잠들 때 여전히 보류 수 있지만 받아 들일 수 없다, 나는 그 권리를 얻었나요? – Husky110

+1

Thread.Sleep (100) 호출로 17 % 코어를 구울 수있는 방법이 꽤 명확하지 않습니다. Anyhoo, AcceptSocket에서 얻는 0 %를 확실히 선호해야합니다. –

답변

0

스레드가 잠든 동안 아무 것도 할 수 없습니다. 특히 연결을 허용 할 수 없습니다. 그래서 당신에게 연결하는 클라이언트는 연결이 성립 될 때까지 100ms를 기다려야합니다 (당신이 Accept와 Accept를 호출 할 때 연결이 성립됩니다).

0
Dim connection As Socket 
Dim reader As BinaryReader 
Dim writer As BinaryWriter 
Dim socketStream As NetworkStream 
Dim listener As TcpListener 

Dim ip As IPAddress = IPAddress.Parse(ipstring) 
listener = New TcpListener(ip, portnumber) 
listener.Start() 

connection = listener.AcceptSocket() 
socketStream = New NetworkStream(connection) 
writer = New BinaryWriter(socketStream) 
reader = New BinaryReader(socketStream) 

이것은 연결 연결을 처리하는 효율적인 방법입니다. :-), 아무것도 자지 않아도됩니다. 성능이 발급 인 경우 스레드의 우선 순위를 줄입니다. 예 :

serverthread.Priority = ThreadPriority.BelowNormal 
0

TCP 연결을 청취하고 서비스하는 것은 표준 디자인 패턴입니다. 코드에서 수행하는 것보다 더 나은 방법이 있습니다. 연결 요청이있을 때까지 차단하는 TcpListener.AcceptTcpClient()을 사용하십시오. 그런 다음 클라이언트에 서비스하기 위해 함께 작업 할 수있는 TcpClient을 반환합니다. AcceptTcpClinet()은 블로킹 호출 (요청이있을 때까지 반환되지 않음)이지만 CPU 시간은 사용하지 않습니다. 이것은 정확히 코드에서 수행하는 작업이므로 (요청이있을 때까지 아무 작업도하지 마십시오) 원하는 작업을 수행합니다.

일반적으로 Thread.Sleep()은 CPU 시간을 포기하는 최상의 방법이 아니므로 피해야합니다. AcceptTcpClinet(), 타이머, 비동기 호출 WaitHandle, Thread.Join() 등과 같은 특수 청취 방법을 사용해야합니다. 그것은하기가 훨씬 더 어렵고 때로는 가치가 없지만 그것이 당신의 목표가되어야합니다.

관련 문제