在另一个答案中,大致使用了以下代码:
c.Events.OnRedirectToAccessDenied = async (context) => context.Response.StatusCode = 403;
Run Code Online (Sandbox Code Playgroud)
编译器对箭头运算符发出警告,表示不会以任何形式等待表达式。删除async关键字确认需要OnRedirectToAccessDenied一个返回 Task ( Func<RedirectContext<CookieAuthenticationOptions>, Task>)的函数,并且以下无法构建:
c.Events.OnRedirectToAccessDenied = (context) => context.Response.StatusCode = 403;
Run Code Online (Sandbox Code Playgroud)
该async关键字似乎仅用于将表达式转换为任务。我以前没见过async用这种方式。
下面的代码不会给出任何编译器警告,但它看起来并不优雅。
c.Events.OnRedirectToAccessDenied = (context) => Task.Run(
() => context.Response.StatusCode = 403
);
Run Code Online (Sandbox Code Playgroud)
编译器警告是否毫无根据,async以这种方式使用是否一个好主意?
如果某件事需要一个 Task 但您实际上没有一个,那么您可以返回Task.CompletedTask以满足该要求并标记该处理已完成,同时仍然保持所有内容同步,并且没有创建状态机的开销(这将是使用async关键字的结果):
c.Events.OnRedirectToAccessDenied = (context) =>
{
context.Response.StatusCode = 403;
return Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)