Windows сервис застрял в «начальном» состоянии и разница между Thread.Sleep () и Task.Delay () - PullRequest
1 голос
/ 18 марта 2020

моя windows служба застряла в начальном состоянии. Ниже приведен код внутри onstart(). log(), который записывает некоторые значения в файл.

while (true)
        {
            log();
            Thread.Sleep(TimeSpan.FromMinutes(5));
        }

после некоторых экспериментов я изменил onstart() на

while (true)
        {
            log();
            await Task.Delay(TimeSpan.FromMinutes(5)).ConfigureAwait(false);
        }

, как только я изменил состояние службы кода, изменилось на работающее и работает нормально. В чем разница между Thread.Sleep () и Task.Delay (), я думал, что оба задерживают выполнение. Может ли кто-нибудь помочь мне понять

Ответы [ 2 ]

5 голосов
/ 18 марта 2020

Тема, которая вызывает OnStart , не является вашей, как вы хотите. На самом деле он используется для ответа на запросы Service Control Manager, направленные к вашему сервису. Ваша служба не считается запущенной, пока вы не вернете из OnStart.

Разница между Thread.Sleep и Task.Delay в том, что первый блокирует текущий поток , тогда как второй (если используется с await, а не с задержкой 0) закончится освобождением текущего потока.

Как только вы добавите async / await к вашему OnStart методу вы фактически возвращаетесь из метода в первый момент выполнения, когда код встречает await на чем-то, что еще не закончено - на вашем await Task.Delay.

2 голосов
/ 18 марта 2020

Я бы порекомендовал иметь System.Timers.Timer, в котором Elapsed событие, которое вы бы сделали работу регистрации. В OnStart вы просто запускаете таймер, а OnStop очищаете (Stop и Dispose таймер).

О Delay против Sleep соображений. Простой способ запомнить разницу - заметить, что Delay возвращает Task, поэтому он будет выполняться асинхронно (поэтому выполнение не будет остановлено ), если не await ed. Thread.Sleep наоборот, блокирует текущий поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...