2012-05-05 20 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該程序需要我的cpu的33%(amd x6 phenom),與thread.sleep它只需要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()等。這是很難做,有時不值得,但這應該是你的目標。