¿Es seguro este hilo?
-
07-07-2019 - |
Pregunta
¿Es seguro este hilo?
private static bool close_thread_running = false;
public static void StartBrowserCleaning()
{
lock (close_thread_running)
{
if (close_thread_running)
return;
close_thread_running = true;
}
Thread thread = new Thread(new ThreadStart(delegate()
{
while (true)
{
lock (close_thread_running)
{
if (!close_thread_running)
break;
}
CleanBrowsers();
Thread.Sleep(5000);
}
}));
thread.Start();
}
public static void StopBrowserCleaning()
{
lock (close_thread_running)
{
close_thread_running = false;
}
}
Solución
Bueno, ni siquiera se compilará, porque estás tratando de bloquear un tipo de valor.
Introduzca una variable de bloqueo separada de un tipo de referencia, por ejemplo
private static readonly object padlock = new object();
Aparte de eso:
Si se llama a StopBrowserCleaning ()
mientras hay hay un hilo de limpieza (mientras está inactivo), pero luego se vuelve a llamar a StartBrowserCleaning ()
antes de que el primer hilo advierta que está destinado a cerrarse, terminará con dos hilos.
Es posible que desee considerar tener dos variables: una para '' está destinado a ser un hilo de limpieza '' y uno para "¿hay realmente un hilo de limpieza?"
Además, si usa un monitor con Wait / Pulse
, o un EventHandle
(por ejemplo, ManualResetEvent
) puede hacer que su sueño sea más tiempo de espera reactivo, donde una solicitud de detención se manejará más rápidamente.