我正在为我的Web应用程序实现自定义IAuthenticationFilter
,并且该接口需要实现异步方法。但是,我的代码实际上并没有异步执行任何操作,所以如果我只编写auth代码,Visual Studio会向我发出一个警告,例如缺少await
运算符。 AuthenticateAsync
方法。
为什么这个界面假设您需要进行异步工作?将我的同步代码放在await Task.Run(() => {...});
的lambda中是否是可接受/合理的解决方法?
答案 0 :(得分:2)
为什么这个界面假设您需要进行异步工作?
它旨在支持异步方法,以防您使用提供异步API的持久层。从异步上下文中使用同步API完全没问题(在此上下文中),但通常无法(安全地)从同步上下文中调用异步方法。由于第一个选项是后者的超集,因此在提供两个接口(例如AuthenticateSync
和AuthenticateAsync
)时没有意义。
返回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线程,所以在进行同步调用时阻止该方法是可以接受的)。