1

次のようなスレッドがあります。

        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 を介して Thread をスリープ モードに送信します。これは何らかの形で彼の仕事の TCPListener に影響を与えますか? また、スレッドがスリープ モードのときに着信接続はどうなりますか?

4

3 に答える 3

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
于 2012-05-05T16:24:38.113 に答える
0

スレッドがスリープしている間は、何もできません。特に、接続を受け入れることができなくなります。そのため、接続しているクライアントは、接続が確立されるまで 100 ミリ秒待機する必要があります (Accept を呼び出して Accept が返されると、接続が確立されます)。

于 2012-05-05T16:08:43.587 に答える
0

TCP 接続をリッスンして提供することは、標準的な設計パターンです。あなたのコードよりも良い方法があります。TcpListener.AcceptTcpClient()接続要求があるまでどのブロックを使用し、それが発生するTcpClientと、クライアントにサービスを提供するために作業できるようになります。AcceptTcpClinet()ブロッキング呼び出し (要求があるまで戻りません) であっても、CPU 時間を使用しません。これはまさにコードで行うことなので(リクエストがあるまで何もしない)、必要な仕事をします。

Thread.Sleep()CPU 時間を放棄する最良の方法ではないため、一般的には避けるべきです。、AcceptTcpClinet()タイマー、非同期呼び出しなどの特殊なリッスン メソッドを使用する必要があります。それを行うのははるかに難しく、時には価値がないこともありますが、それがあなたの目標であるべきです.WaitHandleThread.Join()

于 2012-05-06T09:11:23.373 に答える