在方法调用c#

时间:2019-06-14 12:18:40

标签: c# asynchronous async-await

在与异步方法相同的行中调用await会比调用普通方法慢吗?

据我所知,异步方法对于I / O操作(如从数据库中获取数据)很有用。但是,如果在调用async方法和等待它之间没有任何关系,我需要在同一行中完成。

在这篇帖子Await and Async in the same line中,他们讨论了释放线程带来的好处。

我有一些单元测试用于测试使用异步方法的服务和方法,正如我所描述的,它总是比它们的非异步方法花费更长的时间。我认为这是因为在单独的线程中创建工作,然后等待它需要付出一定的代价。

所以我想问的是,在这种情况下使用async是否真的有一些好处。

public async Task AssignHighestRank(User user)
{
    user.Rank = await _rankRepository.GetHighestRank();
    _userRepository.Update(user);
    await _userRepository.SaveChanges();
}

2 个答案:

答案 0 :(得分:3)

async实现使用了额外的CPU周期,因此从这个意义上讲,async方法比其非异步方法要慢一些。但是,将这种方法与其他async方法一起使用可以提高性能。

例如,考虑一种情况,当您需要一次进行多项更改时:

public async Task RecordBattleResultAsync(User winner, User loser) {
    await Task.WhenAll(
         AssignHighestRankAsync(winner)
    ,    AssignLowestRankAsync(loser)
    ).ConfigureAwait(false);
}

此方法将利用您的两种方法均为async来提高速度的事实。

答案 1 :(得分:-2)

基于此调查,异步方法在进行一致操作时工作缓慢,然后常规方法执行相同操作(如果我们不认为异步方法不像常规方法那样不持有执行线程):

Should I worry about "This async method lacks 'await' operators and will run synchronously" warning

由于在后台进行了大量的编译器工作。但是使用独立数据任务使用操作Task.WhenAll(创建所有任务也完成时创建的任务-未阻塞主线程)和Task.WaitAll(阻塞主线程几乎相同的保存)并使用独立数据任务可能会增加由于并行任务执行,加快了方法执行的速度(方法为Task.WaitAll,但不是整个应用程序)。