tengo un oyente:Multi-roscar con .Net HttpListener
listener = new HttpListener();
listener.Prefixes.Add(@"http://+:8077/");
listener.Start();
listenerThread = new Thread(HandleRequests);
listenerThread.Start();
Y estoy solicitudes de control:
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
}
me gustaría escribir void Stop()
de tal manera, que:
- Se bloqueará hasta que finalicen todas las solicitudes actualizadas (es decir, esperará a que todos los hilos "hagan algunas cosas").
- Mientras espera las solicitudes ya iniciadas, no permitirá más solicitudes (es decir, volver al comienzo de
ListenerCallback
). - Después de eso llamará a
listener.Stop()
(listener.IsListening
se convirtió en falso).
¿Cómo podría ser escribir?
EDIT: ¿Qué opinas de esta solución? ¿Es seguro?
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();
}
}
Esto no es verdad. Si llama a 'listener.Stop()' durante la ejecución de 'ListenerCallback', obtendrá una excepción, por ejemplo. cuando se llama a 'EndGetContext' o incluso más tarde, cuando se utiliza el flujo de salida. Puedo ver las excepciones, por supuesto, pero preferiría no hacerlo. – prostynick
En mi código uso una bandera y ya no me refiero al oyente después de haber llamado "stop", pero al cerrar el oyente no se cierran las conexiones ya aceptadas, solo el oyente. –
No sé a qué te refieres con "Usar una bandera". El problema es que en 'ListenerCallback' estoy usando listener y si otro hilo lo cierra, mientras lo estoy usando, terminaré con excepciones, que mencioné. – prostynick