でマルチスレッド私はリスナーがあります。純HttpListenerを
listener = new HttpListener();
listener.Prefixes.Add(@"http://+:8077/");
listener.Start();
listenerThread = new Thread(HandleRequests);
listenerThread.Start();
を私は要求を処理しています:、私は、このような方法でvoid Stop()
を書きたい
private void HandleRequests()
{
while (listener.IsListening)
{
var context = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
context.AsyncWaitHandle.WaitOne();
}
}
private void ListenerCallback(IAsyncResult ar)
{
var listener = ar.AsyncState as HttpListener;
var context = listener.EndGetContext(ar);
//do some stuff
}
こと:
- 現在処理されているすべてのリクエストが終了するまでブロックされます(つまり、すべてのスレッドが「何かをする」のを待つ)。
- 既に開始されているリクエストを待つ間、それ以上のリクエストは許可されません(すなわち、
ListenerCallback
の先頭に戻る)。 - その後、
listener.Stop()
(listener.IsListening
はfalseになります)を呼び出します。
どのように書き込むことができますか?
EDIT:この解決策についてどう思いますか?それは安全ですか?
public void Stop()
{
lock (this)
{
isStopping = true;
}
resetEvent.WaitOne(); //initially set to true
listener.Stop();
}
private void ListenerCallback(IAsyncResult ar)
{
lock (this)
{
if (isStopping)
return;
resetEvent.Reset();
numberOfRequests++;
}
var listener = ar.AsyncState as HttpListener;
var context = listener.EndGetContext(ar);
//do some stuff
lock (this)
{
if (--numberOfRequests == 0)
resetEvent.Set();
}
}
これは当てはまりません。 'ListenerCallback'の実行中に' listener.Stop() 'を呼び出すと例外が発生します。 'EndGetContext'を呼び出すとき、または出力ストリームを使用するときにはそれを後で呼び出します。私はもちろん、例外をキャッチすることができますが、私はしたくないです。 – prostynick
私のコードでは、私はフラグを使用し、それを停止した後にはリスナーをもう参照しませんが、リスナーを閉じると、受け入れられた接続は閉じず、リスナーだけを閉じません。 –
「私は旗を使う」と言ってどういう意味なのか分かりません。問題は、 'ListenerCallback'でリスナーを使用していて、別のスレッドが閉じていると、私が使用している間に、私が言及した例外に終わることになります。 – prostynick