httpListenerを小さなサーバーアプリに組み込むことを検討しています。それを読んでいる間、私はstackoverflowのこの質問で次のコードスニペットに遭遇しました
Public Class HTTPServer
Shared Listener As HttpListener = New HttpListener
Public Shared Sub Start()
ServicePointManager.DefaultConnectionLimit = 500
ServicePointManager.Expect100Continue = False
ServicePointManager.MaxServicePoints = 500
Listener.Prefixes.Add("http://localhost/")
Listener.Start()
For i As Integer = 1 To (System.Environment.ProcessorCount * 2)
Dim NewThread As New System.Threading.Thread(AddressOf ListenerThread)
NewThread.Priority = ThreadPriority.Normal
NewThread.IsBackground = True
NewThread.Start()
Next
End Sub
Private Shared Sub ListenerThread()
Dim SyncResult As IAsyncResult
While True
SyncResult = Listener.BeginGetContext(New AsyncCallback(AddressOf ListenerCallback), Listener)
SyncResult.AsyncWaitHandle.WaitOne()
End While
End Sub
Private Shared Sub ListenerCallback(ByVal StateObject As IAsyncResult)
Dim Listener As HttpListener = DirectCast(StateObject.AsyncState, HttpListener)
Dim Context As HttpListenerContext = Listener.EndGetContext(StateObject)
Dim Request As HttpListenerRequest = Context.Request
Dim Response As HttpListenerResponse = Context.Response
Dim ResponseString As String = "OK"
Dim Buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(ResponseString)
Response.ContentLength64 = Buffer.Length
Dim OutputStream As System.IO.Stream = Response.OutputStream
OutputStream.Write(Buffer, 0, Buffer.Length)
OutputStream.Close()
OutputStream.Dispose()
End Sub
End Class
これは非常に単純に見え、msdnの例によく似ています。ただし、ダミープロジェクトでテストしたところ、混乱することがいくつかありました。たとえば、コールバックサブからUIオブジェクトに直接アクセスできるため、クロススレッド例外が発生するはずです。
明確にするために、単純なwinformsプロジェクトのメインフォーム内で実行するようにこのコードを少し変更しました。
コードを完全に理解していないようです。たとえば、AsyncWaitHandle.WaitOne()は私にとってまったく新しいものです。
誰かがこのスニペットを簡単に説明してもらえますか?助けていただければ幸いです。