Question

Ce fil est-il sécurisé?

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;
    }
}
Était-ce utile?

La solution

Eh bien, il ne compilera même pas, car vous essayez de verrouiller un type de valeur.

Introduisez une variable de verrouillage distincte d'un type de référence, par exemple.

private static readonly object padlock = new object();

En dehors de cela:

Si StopBrowserCleaning () est appelé alors que est un fil à nettoyer (pendant qu'il dort), puis StartBrowserCleaning () est appelé à nouveau avant que le premier thread ne s'aperçoive qu'il doit s'arrêter, vous obtiendrez deux threads.

Vous pouvez envisager de définir deux variables: une pour "est-il censé être un fil de nettoyage"? et un pour "existe-t-il en réalité un fil de nettoyage"

De même, si vous utilisez un moniteur avec Wait / Pulse ou un EventHandle (par exemple, ManualResetEvent ), vous pouvez rendre votre sommeil plus agréable. temps d'attente réactif, où une demande d'arrêt sera traitée plus rapidement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top