Я изучал это некоторое время, но кажется, что с годами все изменилось, и есть некоторые противоречивые ответы.
В моем методе OnStart
я обычно делал бы то же самое ,
new Thread(new ThreadStart(QueueProcessorDoWork));
Так что он начинает поток, а затем сразу возвращается.
А потом:
private void QueueProcessorDoWork()
{
while (_isRunning)
{
DoStuff();
Thread.Sleep(100);
}
}
Нет способа чтобы сделать DoStuff () блокирующей операцией, он должен опрашивать.
Теперь Thread.Sleep
считается плохой практикой, поскольку он блокирует поток.
Итак, исследования показали, что я можно использовать таймер Никаких проблем с этим, я бы создал таймер и установил его опрос каждые 100 мс, а в обработчике таймера я бы отключил таймер, выполнил обработку, снова включил таймер, и у нас все было бы хорошо.
Однако я тогда читал об использовании async / await с Task.Delay(100)
.
Звучит неплохо. Мне все еще нужно создать Thread
, я считаю, потому что в противном случае метод OnStart не вернется. Однако это неясно, если я вызываю асинхронный метод c, не ожидая его, я не знаю, что произойдет.
Таким образом, вопрос 1 - я должен просто вызвать асинхронную c задачу, которая содержит бесконечное l oop, не дожидаясь его запуска моей windows службы?
Если я действительно хочу использовать async / await в потоке, как именно я go могу начать? Мой ThreadStart может вызывать функцию, которая, в свою очередь, выполняет Task.Run(async () => Worker())
или что-то еще, я не уверен, так как абонент должен был бы быть отмечен как asyn c?
Так что вопрос 2 в том, как мне настроить Шаблон async / await в вызове new Thread()
?
И последний вопрос: какой (или оба?) из двух методов являются «правильным» способом для запуска бесконечной обработки l oop?