Pergunta

É este segmento seguro?

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

Solução

Bem, isso não vai mesmo compilar, porque você está tentando bloqueio em um tipo de valor.

Introduzir uma variável de bloqueio separado de um tipo de referência, por exemplo.

private static readonly object padlock = new object();

Além de que:

Se StopBrowserCleaning() é chamado enquanto há é um fio de limpeza (enquanto ele está dormindo), mas, em seguida, StartBrowserCleaning() é chamado novamente antes de os primeiros avisos de rosca que é destinado a encerrar, você vai acabar com dois tópicos.

Você pode querer considerar ter duas variáveis ??- um para "está lá para ser uma rosca de limpeza" e outra para "há realmente um fio de limpeza"

Além disso, se você usar um monitor com Wait/Pulse, ou um EventHandle (por exemplo ManualResetEvent) você pode fazer seu sono um tempo de espera mais reativo, quando um pedido de parada serão tratados mais rapidamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top