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;
    }
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top