29

我有一个异步方法:

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

4

4 回答 4

25

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

(它们并不完全相同- 例如,如果UserService.LoginExAsync方法抛出异常而不是返回失败的任务,则 async/await 版本将只返回失败的任务,而其他版本也会立即抛出。)

于 2012-10-26T11:45:33.300 回答
11

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

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

于 2012-10-26T11:51:01.943 回答
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;
}

但因为你不是,它不是!

于 2012-10-26T11:50:42.100 回答
2

不需要标记重载,async因为它在内部不等待任何内容,因此编译器无需重写任何内容。

于 2012-10-26T11:45:49.407 回答