lie*_*121 1 c# async-await asp.net-core asp.net-core-webapi
我对 C# 和任务的最佳实践有点困惑。
当我学习 C# 和任务时,它总是一个等待任务的异步函数。但最近我做了一些研究,发现有些人的说法并非如此。他们还表示,限制 async 和 wait 的使用可以提高性能和 RAM 使用率。
例如,在这篇 Stackoverflow 文章中,它说您不应该总是等待每个任务,但该示例不适用于 ASP.NET API,并且没有任何以前的数据用于获取新数据。 这篇文章也赞成不要总是等待每项任务。但这个例子又是一个正在传递的简单任务。
所以我的问题是当有另一个任务必须等待第二个任务时。您可以使用.Result还是我们使用 async/await 更好。因为我听说.Result正在阻塞当前线程。但我看不出当前线程如何不会被等待阻塞,因为第二个语句需要第一个语句的输出。
没有异步/等待的示例
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);
}
Run Code Online (Sandbox Code Playgroud)
异步/等待示例
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);
}
Run Code Online (Sandbox Code Playgroud)
注意:我还听说,在使用 UI 时,等待 UI 相关任务很重要,但这适用于 API。
我建议阅读我的async介绍并跟进我关于elidingasync和 的await帖子。TL;DR:默认使用async/ ,并且仅当该方法是简单传递方法时才忽略它们。await由于您的示例不是简单的传递方法,因此您应该保留async/await关键字。
区分“异步”和“异步”也很重要async。异步代码有多种类型,而async是实现细节 - 一种特定类型的异步代码。您问题中的两种方法都是异步的,但只有一种方法使用async.
他们还表示,限制 async 和 wait 的使用可以提高性能和 RAM 使用率。
是的,通过消除关键字的状态机开销async。但是,这也消除了状态机的所有优势,因此您应该只删除async简单的直通方法。
您可以使用 .Result 还是我们使用 async/await 更好?因为我听说 .Result 正在阻塞当前线程。
您应该尽可能使用async/ ,并避免使用,即使在 ASP.NET Core 上也是如此。awaitResult
但我看不出当前线程如何不会被等待阻塞,因为第二个语句需要第一个语句的输出。
线程没有被阻塞。通过在方法await中粘贴书签然后返回结果来工作。所以线程并没有被阻塞,但你可以认为该方法是“暂停”的。https://blog.stephencleary.com/2012/02/async-and-await.html
| 归档时间: |
|
| 查看次数: |
3051 次 |
| 最近记录: |