【问题标题】:Using async and await in single line [duplicate]在单行中使用 async 和 await [重复]
【发布时间】:2021-09-26 07:11:48
【问题描述】:
var categories1 = _context.Categories.ToList();
var categories2 = _context.Categories.ToListAsync().Result;
var categories3 = await _context.Categories.ToListAsync();
var categories4Task = _context.Categories.ToListAsync();

// do some other work
var categories4 = await categories4Task;

以上四个语句中,第一个语句正常,其他三个语句使用异步编程。

据我所知,如果我们使用异步任务,然后像在 categories4Task 变量中所做的那样在异步任务之后做一些其他工作,这很有用,因为它可以并行工作,并且可以节省总执行时间。

但如果categories2 我们使用Result 属性在同一行中获取结果,并且在categories3 中我们使用asyncawait 在同一行中。这对我们在同一行中使用asyncawait 有什么好处?这是否等于 categories1 查询?

谁能解释一下?

【问题讨论】:

  • How is this beneficial for us to use async and await in same line? 告诉我们您对 async 和 await 的了解程度,以便我们以您可以理解的水平给出答案。
  • 上面四个语句,第一个语句正常,其他三个语句使用异步编程。:第二个语句如何异步?您了解使用.Result 的含义吗?
  • “在 category3 中,我们在同一行中使用 async 和 await。” 我看到的是 await,但我没有看到 async
  • @TheodorZoulias 他们指的是方法名称中的Async
  • categories1是同步调用获取的,categories3是异步调用获取的,因为你使用的是await,所以包含这个语句的方法也将是一个async 方法。您需要阅读的主要内容是async/await 对方法的作用,因为从表面上看,这两个语句看起来都非常相似,但它们对方法的影响却截然不同包含这些语句被编译。

标签: c# asp.net-mvc async-await asp.net-core-mvc


【解决方案1】:

应该避免.Result(和.Wait()),除非是一些非常小众和微妙的场景。基本上:不要那样做。它是非常有害的,即使它不会咬你:它抛弃了async 的所有好处,但保留了成本。

在可能不完整的操作上立即使用await 是正常的和预期的。这样做!

最后一个场景,你开始一个操作然后在等待它之前做其他事情很复杂。在async 之前的代码中,这相当于启动第二个并发线程,因为您现在有 2 个并行运行的执行流。这可以,但你需要非常认真地考虑并发影响。这种方法不能随便使用。

所以:

  1. 正常的同步码
  2. 不要使用
  3. 正常的异步代码
  4. 可能是并发异步代码;谨慎使用

【讨论】:

    【解决方案2】:

    ToListAsyncSingleAsyncFirstOrDefaultAsync 等异步操作可避免在数据库中执行查询或任何其他 I/O 操作时阻塞线程。这样的操作很重要,因为它们允许释放线程,以便它可以服务其他传入的请求。他们还在客户端应用程序中保留响应式 UI。

    EF Core 为执行 I/O 操作的同步方法提供了异步替代方案。效果和同步方法一样,可以和await关键字一起使用(方法必须用async关键字标记)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 2014-12-02
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 2020-06-06
      • 2019-05-24
      • 2019-12-21
      相关资源
      最近更新 更多