我有一个异步方法:
public async Task<UserLoginExResult> 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<UserLoginExResult> LoginExAsync(CustomTable exRequest, bool throwEx = true)
{
return LoginExAsync(exRequest, Language.ID, throwEx);
}
我不确定是否应将重载的参数(参数较少的那个)标记为async
并使用await
?我想我不应该但是你能告诉我如果我这样做会发生什么?我在这里迷失了,并不确定它会等待什么Task
?是否会创建额外的Task
或await
不会创建新的Task
?
答案 0 :(得分:24)
不,当只是要打包和解包现有方法时,使用异步方法几乎没有什么好处。这里只需要一个“普通”方法,委托给“真正的”异步方法。
(它们不是相当相同 - 例如,如果UserService.LoginExAsync
方法抛出异常而不是返回失败的任务,async / await版本将只返回失败任务,而另一个版本也立即投掷。)
答案 1 :(得分:10)
async
关键字仅启用await
关键字。在您的情况下,您可以直接返回Task
,因此不需要async
关键字。 async
只会在不添加任何值的情况下增加开销。
有关详细信息,请参阅Stephen Toub's Zen of Async talk。他直接解决了这种情况。
答案 2 :(得分:5)
如果你在重载中做了额外的工作,那真的是值得做的,例如
public async Task<UserLoginExResult> LoginExAsync(CustomTable exRequest, bool throwEx = true)
{
Task<UserLoginExResult> result = await LoginExAsync(exRequest, Language.ID, throwEx);
//Do some work here that depends on the result from the task completeion
return result;
}
但是你不是,它不是!
答案 3 :(得分:1)
重载不需要标记为async
,因为它没有内部等待任何东西,所以编译器没有任何重写。