Таким образом, если какое-либо исключение возникает в этой части ExecuteAsync или если ExecuteAsync возвращает Task.CompletedTask, это приведет к выполнению return _executingTask;
В более общем случае, если ExecuteAsync
завершитсясинхронно, затем StartAsync
возвращает задачу, возвращенную из ExecuteAsync
.
. В этом конкретном случае (с фоновыми службами) я считаю, что он предназначен для обработки таких вещей, как проверки предварительных условий, которые обычно выполняются синхронно в началеасинхронного метода.Таким образом, если фоновая служба синхронно определяет, что она не может быть запущена, то StartAsync
вернет сбойную задачу.
Этот вид кода встречается крайне редко, а дизайн сомнителен.Например, если фоновая служба асинхронно определяет, что она не может быть запущена, то об этом нет никаких уведомлений.Я думаю, что поведение будет более последовательным, чтобы удалить весь блок if (_executingTask.IsCompleted)
или изменить абстракцию ExecuteAsync
на отдельные части InitializeAsync
и ExecuteAsync
.