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

时间:2012-10-26 11:40:30

标签: c# .net 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;
}

过载:

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

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

4 个答案:

答案 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,因为它没有内部等待任何东西,所以编译器没有任何重写。