2012-05-05 8 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に影響を及ぼしますか?また、スレッドがスリープモードに入っている間にincomming接続はどうなりますか?

+0

はい。あなたが誰かに接続しようとしているとき、コードは奇妙です、あなたはDoSomethingだけです。だから、心配しないで、代わりにAcceptSocketを呼び出すだけで、コアが燃え尽きるのを避けるためにスリープする必要はありません。 –

+0

私はthread.sleepなしでそれを実行すると、プログラムは私のCPU(amd x6 phenom)の33%、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()、タイマー、非同期呼び出し、WaitHandleThread.Join()などの特殊なリスニングメソッドを使用する必要があります。それはやるのがはるかに難しく、時には価値がないこともありますが、それがあなたの目標です。

関連する問題