Jak*_*bRi 28 .net c# asynchronous .net-4.5
我有一个异步方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
过载:
public Task<UserLoginExResult> LoginExAsync(CustomTable exRequest, bool throwEx = true)
{
return LoginExAsync(exRequest, Language.ID, throwEx);
}
Run Code Online (Sandbox Code Playgroud)
我不确定是否应该标记过载的(参数较少的那个)async并使用await?我想我不应该但是你能告诉我如果我这样做会发生什么?我在这里很迷茫但不确定Task它会等待什么?它会创建一个额外的Task或await不创建一个新的Task?
Jon*_*eet 25
不,当它只是打包和解包现有方法时,使用异步方法几乎没有什么好处.这里只需要一个"普通"方法,委托给"真正的"异步方法.
(他们不是很相同-例如,如果该UserService.LoginExAsync方法抛出一个异常,而不是返回失败的任务,异步/ AWAIT版本将只返回一个失败的任务,而另一个版本将会同时,立即扔掉)
Ste*_*ary 10
该async关键字仅启用await关键字.在您的情况下,您可以Task直接返回,因此不需要async关键字.async只会增加开销而不添加任何值.
有关更多信息,请参阅Stephen Toub的Async talk of Zen.他直接解决了这种情况.
如果你在超载中做额外的工作,那真的是值得做的,例如
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;
}
Run Code Online (Sandbox Code Playgroud)
但是,尽管你不是,但事实并非如此!