Быстро при остановке - PullRequest
       14

Быстро при остановке

1 голос
/ 26 сентября 2011

У меня есть этот код:

private STOP = false;

public void Start()
{
     while(!STOP)
     {
          //do some work
          Thread.Sleep(15000);
     }
}

public void Stop()
{
     STOP = true;
}

Но с помощью этого кода иногда нужно подождать 15 секунд, как быстро остановить этот цикл или, возможно, нужно использовать другой код?

Спасибо!

Ответы [ 3 ]

7 голосов
/ 26 сентября 2011

Что-то вроде:

private System.Threading.ManualResetEvent STOP = new System.Threading.ManualResetEvent(false);

public void Start()
{
     while(true)
     {
          //do some work
          if(STOP.WaitOne(15000))
            break;
     }
}

public void Stop()
{
    STOP.Set();
}
3 голосов
/ 26 сентября 2011

Всякий раз, когда вы пишете цикл, который что-то делает, затем ждет относительно длительный период времени (даже одна секунда - долгое время!), Чтобы сделать это снова, вы должны устранить цикл и использоватьтаймерНапример, приведенный выше код может быть переписан:

System.Threading.Timer MyTimer;

public void Start()
{
    MyTimer = new Timer((s) =>
        {
            DoSomeWork();
        }, null, 15000, 15000);
}

Таймер будет срабатывать каждые 15 секунд для выполнения работы.Когда пришло время завершать работу программы, просто утилизируйте таймер.

public void Stop()
{
    MyTimer.Dispose();
}

Это будет более эффективно, чем использование отдельного потока, который проводит большую часть своего времени в спящем режиме, но все еще потребляет системные ресурсы.

1 голос
/ 26 сентября 2011

Использовать ManualResetEvent.WaitOne с таймаутом.

manualResetEvent.WaitOne(timeout)

Установите событие для его пробуждения, или оно проснется после истечения времени ожидания.

См. Этот связанный вопрос.

...