C#-Task.FromResult会招致重罚吗?
我对C#-Task.FromResult会招致重罚吗?,c#,asynchronous,C#,Asynchronous,我对async使用C#编码有点陌生,我遇到过一些地方,在这些地方我必须实现的方法(来自接口或继承服务的一部分,或只是建议的默认约定)被标记为async,并期望返回任务 但我并不总是有异步代码可以运行;我并不总是有需要wait操作员的东西 所以我的临时解决方法是返回wait Task.FromResult({normal code})到这些类型的方法,像这样 public async Task<JsonResult> Id() { // if the user is not a
async
使用C#
编码有点陌生,我遇到过一些地方,在这些地方我必须实现的方法(来自接口或继承服务的一部分,或只是建议的默认约定)被标记为async
,并期望返回任务
但我并不总是有异步代码可以运行;我并不总是有需要wait
操作员的东西
所以我的临时解决方法是返回wait 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)));
}
公共异步任务Id(){
//如果用户没有经过身份验证,只需返回false即可
如果(!User.Identity.IsAuthenticated | | String.IsNullOrEmpty(User.Identity.Name))
返回wait Task.FromResult(Json(false));
返回wait Task.FromResult((Json(User?.FindFirst(“users/id”)?.Value??null));
}
这确实解决了编译时错误,但我想知道这样做是否存在继承问题。如果是这样的话,有什么好方法可以绕过标记为async
但我无法更改的事情?而不是创建一个任务
,然后向该任务添加一个延续,该任务实际上不做任何注释,但将其包装为一个相同的任务
,只返回您创建的第一个任务
由于您无需等待
,因此没有理由将该方法标记为async
考虑到FromResult
的性能成本是一个毫无意义的讨论。您需要根据已有的结果创建任务,以便完成工作。考虑到它有多贵是无关紧要的,因为你没有其他选择。如果您认为可以编写一个性能优于Microsoft版本的方法,那么可以尝试从result
创建自己的
也就是说,不,它不是特别昂贵的操作。如果您没有什么可等待的,请不要将该方法标记为async
。使用Task没有什么错。在您的上下文中,FromResult
是为了解决您遇到的问题而设计的(还有许多其他原因)。但是在上面的例子中,不需要等待任务,只要返回它们并删除async
,即使返回类型标记为Task
?即使返回类型是int
,也不需要int.Parse(42.ToString())
。。。不确定您为什么认为任务
在任何方面都是特殊的。@Ciel,是的,每当您向返回任务
的方法添加异步
时,您就是在要求.NET
将您的方法转换为一个状态机,在
异步方法之后执行一段逻辑。在这里,您只需返回任务