Gle*_*eno 16 c# async-await c#-5.0
试图理解新的异步/等待模式,我有一个问题,我找不到答案,即如果我应该用异步装饰我的方法,如果我打算从其他异步函数调用这些方法,或只是返回Tasks在适当情况下?
换句话说,这些A,B或C类中哪一个最好,为什么?
class A<T>
{
public async Task<T> foo1() //Should be consumed
{
return await foo2();
}
public async Task<T> foo2() //Could be consumed
{
return await foo3();
}
private async Task<T> foo3() //Private
{
return await Task.Run(...);
}
}
class B<T>
{
public async Task<T> foo1() //Should be consumed
{
return await foo2();
}
public async Task<T> foo2() //Could be consumed
{
return await foo3();
}
private Task<T> foo3() //Private
{
return Task.Run(...);
}
}
class C<T>
{
public async Task<T> foo1() //Should be consumed
{
return await foo2();
}
public Task<T> foo2() //Could be consumed
{
return foo3();
}
private Task<T> foo3() //Private
{
return Task.Run(...);
}
}
Run Code Online (Sandbox Code Playgroud)
过度使用方法似乎是多余的,所以我自然倾向于使用C,但与此同时,Task<T>除非您使用await关键字,否则感觉有些尴尬.
两个版本的工作效果相同,唯一的区别是当你await在这里使用时,你会受到一些性能损失(因为必须设置状态机并且最有可能使用延续).
因此,它取决于权衡:您是否希望您的方法更有效,但代价是可读性稍差?或者您是否愿意为了可读性而牺牲性能?
通常情况下,我建议您首先考虑可读性,只关注性能,如果分析告诉您它是值得的.但在这种情况下,我认为可读性的增加很小,所以我可能不会使用await.
另请注意,您的课程C仍然不够远:foo1()也不需要await.