¿Existe una forma estándar de cerrar una aplicación "limpiamente" mientras que algunos objetos WaitHandle
pueden estar en el estado de una llamada de bloqueo actual al WaitOne
?¿Cómo cierras una aplicación cuando WaitHandle se encuentra en medio de una llamada a WaitOne?
Por ejemplo, puede haber un subproceso de fondo que está girando a lo largo de un método como este:
while (_request.WaitOne())
{
try
{
_workItem.Invoke();
}
finally
{
OnWorkCompleted();
}
}
no veo ninguna manera obvia de disponer de este hilo sin llamar Thread.Abort
(que por lo que entiendo es desanimado). Si llama al Close
en el objeto _request
(un AutoResetEvent
), se lanzará una excepción.
En la actualidad, el hilo que ejecuta este bucle tiene la propiedad IsBackground
establecido en true
, y por lo tanto la aplicación aparece para cerrar correctamente. Sin embargo, dado que WaitHandle
implementa IDisposable
, no estoy seguro si esto se considera kosher o si ese objeto realmente debe eliminarse antes de que la aplicación finalice.
¿Es este un mal diseño? De lo contrario, ¿cómo se trata este escenario?
Totalmente tiene sentido. Pero, ¿significa esto que * no * está bien tener simplemente el hilo ejecutando este bucle inicializado con 'IsBackground = true '(de modo que cuando la aplicación sale, el bucle termina aunque el' WaitHandle' aún está esperando)? –
@Dan: Probablemente también esté bien, pero este método le permitirá finalizar el subproceso con elegancia sin tener que cerrar toda la aplicación. –
Hola. Acabo de hacerte otra pregunta sobre este patrón. ¿Es este el patrón para detener un hilo mediante el identificador de espera? (en lugar de usar abort/interrupt)? –