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
将您的方法转换为一个状态机,在
异步方法之后执行一段逻辑。在这里,您只需返回任务