C# ASP.NET 核心 API Async/await VS 结果
C# ASP.NET Core API Async/await VS Result
我对 C# 和任务的最佳实践有点困惑。
当我学习 c# 和任务时,它始终是等待任务的异步函数。但最近我一直在做一些研究,发现有些人持不同意见。他们还表示,限制使用 async 和 await 可以提高性能和 Ram 使用率。
例如在 它说你不应该总是等待每个任务但是这个例子不是 ASP.NET API 并且没有任何以前的数据用于获取新数据。
This post 也赞成不要总是等待每个任务。但同样,该示例是一个简单的任务。
所以我的问题是当有另一个任务必须等待第二个任务时的情况。您可以使用 .Result
还是我们使用 async/await 更好。因为我听说 .Result
阻塞了当前线程。
但是我看不出当前线程如何不被 await 阻塞,因为第二条语句需要第一条语句的输出。
示例没有 async/await
public Task<User> SaveUser(User user)
{
var dbUser = _userRepository.GetByUid(user.Id).Result;
if(dbUser == null) {
dbUser = new User();
dbUser.Id = Guid.NewGuid();
}
dbUser.Name = user.Name;
return _userRepository.Save(dbUser);
}
示例 async/await
public async Task<User> SaveUser(User user)
{
var dbUser = await _userRepository.GetByUid(user.Id);
if(dbUser == null) {
dbUser = new User();
dbUser.Id = Guid.NewGuid();
}
dbUser.Name = user.Name;
return await _userRepository.Save(dbUser);
}
注意:我还听说在使用 UI 时,等待 UI 相关任务很重要,但这适用于 API。
我建议阅读我的 async
intro and following up with my post on eliding async
and await
。 TL;DR:默认使用 async
/await
,只有当方法是简单的直通方法时才省略它们。由于您的示例不是简单的直通方法,因此您应该保留 async
/await
关键字。
区分“异步”和 async
也很重要。有几种异步代码,而 async
是一个实现细节 - 一种特定类型的异步代码。您问题中的两种方法都是异步的,但只有一种使用 async
.
They also say that limiting usage of async and await can improve performance and Ram usage.
是的,通过删除 async
关键字的状态机开销。但是,这也消除了状态机的所有好处,因此您应该只在简单的直通方法上删除 async
。
Can you use .Result or is it better us use async/await. Because I heard .Result is blocking the current thread.
您应该尽可能使用 async
/await
,并且 avoid Result
, even on ASP.NET Core.
But I can't see how the current thread would not be blocked by the await since the output of the first statement is needed for the second statement.
线程没有阻塞。 await
的工作原理是在 方法 中添加一个书签,然后返回一个结果。所以线程没有被阻塞,但是你可以认为这个方法是“暂停”的。 https://blog.stephencleary.com/2012/02/async-and-await.html
我对 C# 和任务的最佳实践有点困惑。
当我学习 c# 和任务时,它始终是等待任务的异步函数。但最近我一直在做一些研究,发现有些人持不同意见。他们还表示,限制使用 async 和 await 可以提高性能和 Ram 使用率。
例如在
所以我的问题是当有另一个任务必须等待第二个任务时的情况。您可以使用 .Result
还是我们使用 async/await 更好。因为我听说 .Result
阻塞了当前线程。
但是我看不出当前线程如何不被 await 阻塞,因为第二条语句需要第一条语句的输出。
示例没有 async/await
public Task<User> SaveUser(User user)
{
var dbUser = _userRepository.GetByUid(user.Id).Result;
if(dbUser == null) {
dbUser = new User();
dbUser.Id = Guid.NewGuid();
}
dbUser.Name = user.Name;
return _userRepository.Save(dbUser);
}
示例 async/await
public async Task<User> SaveUser(User user)
{
var dbUser = await _userRepository.GetByUid(user.Id);
if(dbUser == null) {
dbUser = new User();
dbUser.Id = Guid.NewGuid();
}
dbUser.Name = user.Name;
return await _userRepository.Save(dbUser);
}
注意:我还听说在使用 UI 时,等待 UI 相关任务很重要,但这适用于 API。
我建议阅读我的 async
intro and following up with my post on eliding async
and await
。 TL;DR:默认使用 async
/await
,只有当方法是简单的直通方法时才省略它们。由于您的示例不是简单的直通方法,因此您应该保留 async
/await
关键字。
区分“异步”和 async
也很重要。有几种异步代码,而 async
是一个实现细节 - 一种特定类型的异步代码。您问题中的两种方法都是异步的,但只有一种使用 async
.
They also say that limiting usage of async and await can improve performance and Ram usage.
是的,通过删除 async
关键字的状态机开销。但是,这也消除了状态机的所有好处,因此您应该只在简单的直通方法上删除 async
。
Can you use .Result or is it better us use async/await. Because I heard .Result is blocking the current thread.
您应该尽可能使用 async
/await
,并且 avoid Result
, even on ASP.NET Core.
But I can't see how the current thread would not be blocked by the await since the output of the first statement is needed for the second statement.
线程没有阻塞。 await
的工作原理是在 方法 中添加一个书签,然后返回一个结果。所以线程没有被阻塞,但是你可以认为这个方法是“暂停”的。 https://blog.stephencleary.com/2012/02/async-and-await.html