.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
因为它不会在内部等待任何东西,因此编译器没有任何重写。