【发布时间】:2016-02-08 19:24:30
【问题描述】:
我对使用C# 编码的async 有点陌生,并且遇到了一些我必须实现的方法(来自接口或继承服务的一部分,或者只是建议的默认约定)的地方标记为async 并期待Task<T> 返回。
但我并不总是要运行异步代码;我并不总是有需要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 的问题?
【问题讨论】:
-
如果您没有任何等待,请不要将方法标记为
async。 -
在您的上下文中使用
Task.FromResult没有任何问题,它的设计(以及许多其他原因)旨在解决您遇到的问题。但是在您上面的情况下,不需要await您的任务,只需返回它们并删除async -
即使返回类型标记为
Task<T>? -
即使返回类型是
int也不需要Int.Parse(42.ToString())...不知道为什么你认为Task<T>在任何方面都很特别。 -
@Ciel,是的,每当您将
async添加到返回Task的方法时,您就是在要求.NET将您的方法转换为执行一段逻辑@987654340 的状态机@你的异步方法。这里你要做的就是返回任务
标签: c# asynchronous