Вопрос

Безопасен ли этот поток?

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;
    }
}
Это было полезно?

Решение

Ну, он даже не скомпилируется, потому что вы пытаетесь заблокировать тип значения.

Введите отдельную переменную блокировки ссылочного типа, например

.
private static readonly object padlock = new object();

Кроме этого:

Если StopBrowserCleaning () вызывается, когда является потоком очистки (пока он спит), но затем вызывается StartBrowserCleaning () прежде чем первый поток заметит, что он должен завершиться, вы получите два потока.

Возможно, вы захотите рассмотреть две переменные - одна для " предназначена ли она для очистки потока " и один для "есть ли на самом деле чистящий поток?"

Кроме того, если вы используете монитор с Wait / Pulse или EventHandle (например, ManualResetEvent ), вы можете сделать свой сон более реактивное время ожидания, когда запрос на остановку будет обработан быстрее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top