.NET 4.5异步等待和重载方法

我有一个异步方法:

public async Task LoginExAsync(CustomTable exRequest, string language, bool throwEx = true) { UserLoginExResult result = await UserService.LoginExAsync(UserGroup, language, TimezoneOffset, GetDeviceInfo(), GetLoginProperties(), exRequest); ProcessLoginResult(result, false, throwEx); return result; } 

过载:

 public Task LoginExAsync(CustomTable exRequest, bool throwEx = true) { return LoginExAsync(exRequest, Language.ID, throwEx); } 

我不确定是否应该将重载的(参数较少的那个)标记为async并使用await ? 我想我不应该但是你能告诉我如果我这样做会发生什么事吗? 我在这里迷失了,并不确定它会等待什么Task ? 它会创建一个额外的Task还是await不创建新Task

不,当它只是打包和解包现有方法时,使用异步方法几乎没有什么好处。 这里只需要一个“普通”方法,委托给“真正的”异步方法。

(它们并不完全相同 – 例如,如果UserService.LoginExAsync方法抛出exception而不是返回失败的任务,则async / await版本将仅返回失败的任务,而另一个版本将立即抛出。)

async关键字仅启用await关键字。 在您的情况下,您可以直接返回Task ,因此不需要async关键字。 async只会增加开销而不添加任何值。

有关更多信息,请参阅Stephen Toub的Async talk of Zen 。 他直接解决了这种情况。

如果你在你的超载中做额外的工作,那真的是值得做的,例如

 public async Task LoginExAsync(CustomTable exRequest, bool throwEx = true) { Task result = await LoginExAsync(exRequest, Language.ID, throwEx); //Do some work here that depends on the result from the task completeion return result; } 

但是,尽管你不是,但事实并非如此!

过载不需要标记为async因为它不会在内部等待任何东西,因此编译器没有任何重写。