我正在为我的 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)(例如 AuthenticateSync
和 AuthenticateAsync
)毫无意义。
返回 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 线程,所以在进行同步调用时阻止该方法是可以接受的)。