这个问题很折磨人,我找不到明确的答案。它没有谷歌。
这里我有一个真正的异步方法,其中有几个await's。此方法在更高级别调用:
public async Task<Result> UpperLevelMethod()
{
return await _component.RealyAsyncMethod();
}
依此类推,贯穿应用程序的所有层。
但理论上,你可以这样写:
public Task<Result> UpperLevelMethod()
{
return _component.RealyAsyncMethod();
}
并且通话await UpperLevelMethod()将正常工作。而且,据我了解,这种方法更好,因为。不会创建其他实例IAsyncStateMachine,如果我错了,请纠正我。
有趣的是,绘画中的文章和书籍的作者描述了打包/解包的后果,但在异步部分中不知何故忽略了这一点。
这样的电话有什么陷阱吗?或者,在您不需要执行异步延续的情况下,是否可以(甚至更好)使该方法不是异步的?
PS同一个 Skeet 描述了最好这样做来检查参数:
public Task<Result> UpperLevelMethod(string arg)
{
/*
Проверка аргумента и выброс исключения в случае ошибки
*/
return _component.RealyAsyncMethod();
}
但他具体谈论的是检查参数,以便它在同步模式下进行。关于优化 - 没什么。
更新: 版本中内置的控制台应用程序,代码如下:
static void Main(string[] args)
{
Task.Run(Foo5);
}
static async Task<int> Foo1() => await Task.FromResult(5);
static Task<int> Foo2() => Foo1();
static Task<int> Foo3() => Foo2();
static Task<int> Foo4() => Foo3();
static Task<int> Foo5() => Foo4();
重 8192 字节,加上await's - 10240 字节。
async没错,如果没有它代码可以工作,最好不要再次编写。没有理由写多余的单词async和await.