Использование asyn c для создания неявной задачи? - PullRequest
2 голосов
/ 01 мая 2020

В другом ответе примерно был использован следующий код:

c.Events.OnRedirectToAccessDenied = async (context) => context.Response.StatusCode = 403;

Компилятор предупреждает в операторе стрелки, что выражение не ожидается в любой форме. Удаление ключевого слова async подтверждает, что для OnRedirectToAccessDenied требуется функция, которая возвращает задание (Func<RedirectContext<CookieAuthenticationOptions>, Task>), а следующее не может быть построено:

c.Events.OnRedirectToAccessDenied = (context) => context.Response.StatusCode = 403;

Ключевое слово async используется только для преобразования Кажется, выражение задачи. Я не видел, чтобы async использовал этот способ раньше.

Следующий код не выдаст никаких предупреждений компилятора, но выглядит не так элегантно.

c.Events.OnRedirectToAccessDenied = (context) => Task.Run(
                                                    () => context.Response.StatusCode = 403
                                                 );

Является ли компилятор предупреждение неоправданно, и является ли хорошей идеей использовать async таким образом?

Ответы [ 2 ]

6 голосов
/ 01 мая 2020

Если что-то нужно для Задачи, но у вас ее на самом деле нет, вы можете вернуть Task.CompletedTask, чтобы удовлетворить это требование и , чтобы отметить, что обработка завершена, при этом сохраняя все синхронно и без накладные расходы на создание конечного автомата (что может быть результатом использования ключевого слова async):

c.Events.OnRedirectToAccessDenied = (context) =>
{
    context.Response.StatusCode = 403;
    return Task.CompletedTask;
}
0 голосов
/ 01 мая 2020

Вы также можете подождать что-то, чтобы просто выдать предупреждение go:

c.Events.OnRedirectToAccessDenied = async (context) =>
{
    context.Response.StatusCode = 403;
    await Task.CompletedTask; // Suppress the warning CS1998
};

Издержки конечного автомата незначительны. Поэтому выбирайте исходя из того, что вы считаете более естественным и интуитивным.

...