У меня есть слушатель:
listener = new HttpListener();
listener.Prefixes.Add(@"http://+:8077/");
listener.Start();
listenerThread = new Thread(HandleRequests);
listenerThread.Start();
И я обрабатываю запросы:
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
}
Я хотел бы написать void Stop()
таким образом, что:
- Он будет блокироваться до тех пор, пока все обработанные в настоящий момент запросы не будут завершены (т.е. будут ждать, пока все потоки будут "делать что-то" ).
- Пока он будет ждать уже запущенных запросов, он не позволит больше запросов (т.е. возвращает в начале
ListenerCallback
). - После этого он вызовет
listener.Stop()
(listener.IsListening
стал ложным).
Как это можно написать?
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();
}
}