为什么IAuthenticationFilter的方法是异步的?

时间:2018-02-08 00:49:44

标签: c# asp.net asynchronous

我正在为我的Web应用程序实现自定义IAuthenticationFilter,并且该接口需要实现异步方法。但是,我的代码实际上并没有异步执行任何操作,所以如果我只编写auth代码,Visual Studio会向我发出一个警告,例如缺少await运算符。 AuthenticateAsync方法。

为什么这个界面假设您需要进行异步工作?将我的同步代码放在await Task.Run(() => {...});的lambda中是否是可接受/合理的解决方法?

1 个答案:

答案 0 :(得分:2)

  

为什么这个界面假设您需要进行异步工作?

它旨在支持异步方法,以防您使用提供异步API的持久层。从异步上下文中使用同步API完全没问题(在此上下文中),但通常无法(安全地)从同步上下文中调用异步方法。由于第一个选项是后者的超集,因此在提供两个接口(例如AuthenticateSyncAuthenticateAsync)时没有意义。

返回Task<T>的方法并不总是需要async修饰符(即使方法名称中包含Async),因此您可以移除async修饰符来修复编译器警告。您可以使用return Task.FromResult( returnValue )返回值。在这种情况下,AuthenticateAsync会返回Task,因此您只需要return Task.CompletedTask;

简而言之:删除async修饰符并执行正常的同步,阻止AuthenticateAsync内的IO,但最后只放return Task.CompletedTask;而不是return

  

将同步代码放在await Task.Run(() => {...});的lambda中是否是可接受/合理的解决方法?

使用Task.Run没有任何好处(因为ASP.NET中没有UI线程,所以在进行同步调用时阻止该方法是可以接受的)。