Обработка и утилизация сброшенных заданий c#. NET - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть сервис windows, в котором есть методы, которые запускают и забывают о задачах. Я хотел бы получить некоторую ясность о том, как они обрабатываются, когда служба windows останавливается или перезапускается?

Для ясности я использую этот код: _ = Task.Run (() => DoSomething () );

Если эта задача находится на полпути выполнения, как служба windows обрабатывает как остановку, так и перезапуск службы?

(1) Мое предположение о перезапуск заключается в том, что будет вызван метод службы OnStop (), задача «забей и забудь» продолжится. Затем будет вызван OnStart (), и снова задача продолжения и забывания должна продолжиться. Задание будет выполнено по завершении. Есть ли какое-либо другое управление задачами или памятью, которое происходит автоматически во время выполнения. net в этом процессе?

(2) Я предполагаю, что при остановке вызывается метод службы OnStop (), задание огонь и забыть продолжится. Будет возвращен метод OnStop, затем служба будет убита, что приведет к уничтожению задачи «огонь и забыл».

(3) Следовательно, использование задач «забыть» и «забыть», по моим собственным предположениям, не должно мешать службе либо Остановка или перезапуск.

Примечание. У меня проблемы с остановкой и перезапуском службы. Поэтому я пытаюсь определить поведение здесь. Кто-нибудь может подтвердить или опровергнуть мои предположения? Спасибо.

1 Ответ

0 голосов
/ 28 апреля 2020

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

В сервисах задачи «забей и забудь» представляют другой риск. См. официальную документацию :

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

Мой совет - избегать задач запуска и забывания. Когда вы запускаете такую ​​задачу, добавьте ее в список. В вашем методе OnStop пройдите по этому списку go и дождитесь завершения всех задач. Если у вас есть задачи, которые вы можете отменить, отмените их и снова дождитесь их завершения.

...