EndAcceptTcpClientごとにスレッドが作成されるのかと思ったら、1スレッドしか作成できないらしい。何のための非同期なんだろう。。。1つ目のTcpClient作成後に、別の要求があっても2つ目のスレッドは作成されないで1つ目のTcpClientが終了するまでコールバックが呼ばれない。。。うむむ。
Public Sub run() Dim socks As clsSocket() = New clsSocket(1) {} Dim waits As Threading.WaitHandle() = New Threading.WaitHandle(socks.Length - 1) {} Debug.Print(Threading.Thread.CurrentThread.ManagedThreadId) mServer.Start(socks.Length - 1) Do For i As Integer = 0 To socks.Length - 1 Dim wrkIdx As Integer = i If waits(wrkIdx) Is Nothing Then socks(wrkIdx) = New clsSocket(mIGetMessage) waits(wrkIdx) = mServer.BeginAcceptTcpClient(Sub(aISyncResult As IAsyncResult) Debug.Print(Threading.Thread.CurrentThread.ManagedThreadId) socks(wrkIdx).Begin(mServer.EndAcceptTcpClient(aISyncResult).GetStream()) End Sub, Nothing).AsyncWaitHandle End If Next waits(Threading.EventWaitHandle.WaitAny(waits)) = Nothing Loop End Sub PR |
このサンプルでは? https://msdn.microsoft.com/ja-jp/library/system.net.sockets.tcplistener.endaccepttcpclient(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2 |
最初と2つ目のスレッドIDだけが固有で、以降2つ目のスレッドIDが使われるため共有ロックになってしまいますね。。。
【2018/03/21 06:34】| | nwpfh #2aa3e25d1b [ 編集 ]
|
|
忍者ブログ [PR] |