在与异步方法相同的行中调用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();
}
答案 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
,但不是整个应用程序)。