我对使用C#
进行async
编程还有些陌生,遇到一些情况需要我实现的方法(可能是从一个接口或继承服务中得到的,或者只是默认建议)会被标记为async
并且期望返回Task<T>
。
但我并不总是需要运行async
代码,也不总是需要await
操作符。
因此,我的临时解决方法是针对这种类型的方法,返回await Task.FromResult({normal code});
,就像这样...
public async Task<JsonResult> Id() {
// if the user is not authenticated, simply return false
if (!User.Identity.IsAuthenticated || String.IsNullOrEmpty(User.Identity.Name))
return await Task.FromResult(Json(false));
return await Task.FromResult((Json(User?.FindFirst("users/id")?.Value ?? null)));
}
这确实解决了编译时错误,但我想知道这样做是否存在潜在问题。如果有的话,有哪些好的方法可以绕过被标记为async
且无法更改的事物?
Task.FromResult
没有任何问题,它已经被设计用来解决像您遇到的这样的问题(除了许多其他原因)。但在您上面的情况下,不需要等待您的任务,只需返回它们并删除async
即可。 - user5766999Task<T>
? - Cielint
,也不需要使用Int.Parse(42.ToString())
... 不确定为什么您认为Task<T>
有什么特殊之处。 - Alexei Levenkovasync
添加到返回Task
的方法中时,您都要求.NET
将您的方法转换为状态机,该状态机在异步方法之后执行一段逻辑。在这里,您只想返回任务。 - user5766999