Domanda

Questo thread è sicuro?

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;
    }
}
È stato utile?

Soluzione

Beh, non si compila nemmeno, perché stai cercando di bloccare un tipo di valore.

Introdurre una variabile di blocco separata di un tipo di riferimento, ad esempio

private static readonly object padlock = new object();

A parte questo:

Se StopBrowserCleaning () viene chiamato mentre è un thread di pulizia (mentre è inattivo), ma viene quindi richiamato StartBrowserCleaning () prima che il primo thread noti che è destinato a chiudere, finirai con due thread.

Potresti prendere in considerazione la possibilità di avere due variabili: una per " esiste un thread di pulizia " e uno per " esiste effettivamente un thread di pulizia. "

Inoltre, se usi un monitor con Wait / Pulse o un EventHandle (ad es. ManualResetEvent ) puoi migliorare ulteriormente il tuo sonno tempo di attesa reattivo, in cui una richiesta di arresto verrà gestita più rapidamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top