c# - 为什么 IAuthenticationFilter 方法是异步的?

标签 c# asp.net asynchronous

<分区>

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

为什么这个接口(interface)假设你需要做异步工作?将我的同步代码放入 await Task.Run(() => {...}); 的 lambda 中是否是可接受/明智的解决方法?

最佳答案

Why does this interface assume that you will need to do asynchronous work?

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

返回 Task<T> 的方法并不总是需要 async修饰符(即使它们在方法名称中有 Async)所以你可以删除 async修正编译器警告的修饰符。您可以使用 return Task.FromResult( returnValue ) 返回一个值.在这种情况下 AuthenticateAsync返回 Task所以你只需要 return Task.CompletedTask;

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

Is it an acceptable/sensible workaround to just put my synchronous code inside the lambda of an await Task.Run(() => {...});?

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

关于c# - 为什么 IAuthenticationFilter 方法是异步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48675755/

相关文章:

c# - 如何将对象列表从一个实体复制到另一个实体

c++ - 带线程的异步方法

c++ - Mac 和 Linux 上 C++11 异步行为的差异

c# - Elasticsearch-按分数过滤前N个文档,然后按字段排序

c# - 有没有办法将PropertyGrid控件的字符串字段标记为 "No nulls or empty strings allowed"?

asp.net - Windows 进程激活服务 (WAS) 在启动工作进程来为应用程序池提供服务时遇到故障

c# - 如何调用启用 SSL 的 Web Api?

multithreading - 何时使用非阻塞 >!/线程和阻塞>!!/带有 clojure core.async 的 goroutines

c# - 如何在不拆分单词的情况下将字符串拆分为List <string>?

jQuery asp 控件 .prop (“disabled” 、 “” ) 未启用 IE 9 中的复选框