Какой сценарий рассматривается, если вы не ожидаете асинхронного метода и сразу не оцените IsCompleted? - PullRequest
1 голос
/ 01 апреля 2019

Класс BackgroundService содержит следующий код:

public virtual Task StartAsync(CancellationToken cancellationToken)
{
    // Store the task we're executing
    _executingTask = ExecuteAsync(_stoppingCts.Token);

    // If the task is completed then return it, this will bubble cancellation and failure to the caller
    if (_executingTask.IsCompleted)
    {
        return _executingTask;
    }

    // Otherwise it's running
    return Task.CompletedTask;
}

Я прочитал https://www.markopapic.com/csharp-under-the-hood-async-await/, что заставляет меня предположить, что весь код от ExecuteAsync до его первого (если есть) await ... выполняется до того, как будет достигнут if (_executingTask.IsCompleted). Таким образом, если какое-либо исключение произойдет в этой части ExecuteAsync или если ExecuteAsync вернет Task.CompletedTask, это приведет к выполнению return _executingTask;.

Правильно ли мое понимание этого?

1 Ответ

2 голосов
/ 01 апреля 2019

Таким образом, если какое-либо исключение возникает в этой части ExecuteAsync или если ExecuteAsync возвращает Task.CompletedTask, это приведет к выполнению return _executingTask;

В более общем случае, если ExecuteAsync завершитсясинхронно, затем StartAsync возвращает задачу, возвращенную из ExecuteAsync.

. В этом конкретном случае (с фоновыми службами) я считаю, что он предназначен для обработки таких вещей, как проверки предварительных условий, которые обычно выполняются синхронно в началеасинхронного метода.Таким образом, если фоновая служба синхронно определяет, что она не может быть запущена, то StartAsync вернет сбойную задачу.

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

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