Frage

Ist das Thread-sicher?

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;
    }
}
War es hilfreich?

Lösung

Nun, es wird nicht einmal kompilieren, weil Sie sich auf einen Werttyp zu sperren versuchen.

Einführung eines separaten Verriegelungsvariable eines Referenztyp, z.

private static readonly object padlock = new object();

Abgesehen davon:

Wenn StopBrowserCleaning() aufgerufen wird, während es ist ein Reinigungsfaden (während sie schlafen ist), aber dann wird StartBrowserCleaning() erneut aufgerufen, bevor die ersten Thread bemerkt, dass es herunterzufahren gemeint ist, werden Sie am Ende mit zwei Threads.

Sie möchten vielleicht zwei Variablen zu berücksichtigen, die - „ist es tatsächlich ein Reinigungs Faden“ ein für „ist gemeint, ein Reinigungs Thread zu sein“ und eine für

Auch, wenn Sie einen Monitor mit Wait/Pulse verwenden oder ein EventHandle (z ManualResetEvent) können Sie Ihren Schlaf eine reaktive Wartezeit machen, wenn ein Antrag schneller bearbeitet werden zu stoppen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top