Подтвердить что ты не робот

Thread.Sleep или Thread.Yield

У меня есть метод, который использует фоновый рабочий для опроса DLL для статуса, выглядящего примерно так:

var timeout = DateTime.Now.AddSeconds(3);
while (System.Status != Status.Complete  // our status is not complete
       && DateTime.Now < timeout         // have not timed out
       && !_Worker.CancellationPending)  // backgroundworker has not been canceled
{
    //Thread.Yield();
    //Thread.SpinWait(1);
    //Thread.Sleep(1);
}

Когда я смотрю на мой процессор%, yield() и spinwait() заставляют мое приложение снимать до 50% на моем ПК. При Sleep(1) мой процессор% остается на уровне 6%. Мне сказали, что я должен выбрать Thread.Yield(), однако всплески в CPU меня беспокоят. Что лучше всего подходит для чего-то подобного?

4b9b3361

Ответ 1

Thread.Yield прервет текущий поток, чтобы другие потоки могли работать. Однако, если у них нет работы, ваш поток скоро будет перенесен и продолжит опрос, таким образом, 100% -ное использование 1 ядра.

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

Thread.Sleep запустит ваш поток для повторного запуска после истечения времени ожидания, что значительно снизит загрузку процессора.

Блокирует текущий поток для указанного количества миллисекунд.

Учитывая выбор между двумя, Thread.Sleep лучше подходит для вашей задачи. Тем не менее, я согласен с комментарием от @Bryan, что Threading.Timer делает более элегантное решение.