为什么在C#方法中我们需要多个`await`语句?

hellouworld

为什么await在C#方法中需要多个语句?

例如,这里有三个await语句:

using System;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;

namespace Acme.BookStore
{
    public class BookStoreDataSeederContributor
        : IDataSeedContributor, ITransientDependency
    {
        private readonly IRepository<Book, Guid> _bookRepository;

        public BookStoreDataSeederContributor(IRepository<Book, Guid> bookRepository)
        {
            _bookRepository = bookRepository;
        }

        public async Task SeedAsync(DataSeedContext context)
        {
            if (await _bookRepository.GetCountAsync() > 0)
            {
                return;
            }

            await _bookRepository.InsertAsync(
                new Book
                {
                    Name = "1984",
                    Type = BookType.Dystopia,
                    PublishDate = new DateTime(1949, 6, 8),
                    Price = 19.84f
                }
            );

            await _bookRepository.InsertAsync(
                new Book
                {
                    Name = "The Hitchhiker's Guide to the Galaxy",
                    Type = BookType.ScienceFiction,
                    PublishDate = new DateTime(1995, 9, 27),
                    Price = 42.0f
                }
            );
        }
    }
}

如果我们将删除第二和第三条await语句,则SeedAsync不会阻塞任何额外的线程,因为在第一个语句之后,await我们就不会阻塞任何有用的线程,而我们已经为第一个分配了一个额外的线程await因此,通过使用第二和第三条await语句,我们可以分配额外的两个线程。

我在这里想念什么吗?由于这abp.io似乎是一个很大的项目,我怀疑这些示例不会是不合理的,因此,一定有理由使用这三个await语句而不是一个。

主题三

await将等待直到不执行该操作。因此,您有2个异步操作,这就是为什么需要使用await的原因。

一个await用于每个异步操作(方法)。

因此,您有3种异步方法。您可以在不等待的情况下调用它,但是它将崩溃。当您不等待而调用它时,它将在另一个线程中开始执行,并且正在执行SeedAsync的线程将不会等待,直到执行InsertAsync。它将同时启动第二个InsertAsync

因此,就您而言,您可以不等待而插入值。它将起作用。但是在通常情况下,最好使用await。因为操作顺序通常很重要。等待允许控制操作顺序

有时您需要运行一些任务,然后等待所有任务。那你可以用Task.WhenAll(t1,t2,t3)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么我们需要Java中的默认方法?

来自分类Dev

为什么我们需要C ++中的虚函数?

来自分类Dev

为什么我们需要在C#中锁定并反对?

来自分类Dev

为什么我们必须等待C#中的异步方法调用

来自分类Dev

为什么我们需要指针为Go / C中的变量分配值,而不是C#/ Java中的指针

来自分类Dev

为什么我们的Android项目需要多个清单?

来自分类Dev

为什么我们需要对象发送者作为 c# 中的参数事件处理程序?

来自分类Java

为什么我们需要抽象方法?

来自分类Dev

Firebase:为什么我们需要bindTo方法?

来自分类Dev

为什么我们需要 Buffer.isBuffer 方法?

来自分类Dev

为什么我们需要在C#中装箱和拆箱?

来自分类Java

为什么我们到底需要Java中的StringBuffer

来自分类Java

为什么我们需要纯<?>在Java中?

来自分类Dev

为什么我们在MongoDB中需要created_at

来自分类Dev

为什么我们需要python中的协程?

来自分类Java

为什么我们需要Java中的Properties类?

来自分类Dev

为什么我们需要Kubernetes中的服务帐户?

来自分类Linux

为什么我们在芹菜中需要签名?

来自分类Dev

为什么我们在git中需要SSH密钥?

来自分类Dev

为什么我们需要Clojure中的'in(require'[...]])?

来自分类Java

为什么我们需要Java中的弱引用

来自分类Python

为什么我们在Python中需要“ finally”子句?

来自分类Java

为什么我们在Hadoop堆栈中需要ZooKeeper?

来自分类Dev

为什么我们在Typescript中需要任何类型?

来自分类Dev

为什么我们需要Python中的属性?

来自分类Dev

为什么我们在区块链中需要 TLSNotary?

来自分类Dev

为什么我们需要声明枚举变量?(C)

来自分类Dev

为什么我们需要在此脚本中调用“ c.set.bind(c)”?

来自分类Dev

为什么我们需要需求?

Related 相关文章

  1. 1

    为什么我们需要Java中的默认方法?

  2. 2

    为什么我们需要C ++中的虚函数?

  3. 3

    为什么我们需要在C#中锁定并反对?

  4. 4

    为什么我们必须等待C#中的异步方法调用

  5. 5

    为什么我们需要指针为Go / C中的变量分配值,而不是C#/ Java中的指针

  6. 6

    为什么我们的Android项目需要多个清单?

  7. 7

    为什么我们需要对象发送者作为 c# 中的参数事件处理程序?

  8. 8

    为什么我们需要抽象方法?

  9. 9

    Firebase:为什么我们需要bindTo方法?

  10. 10

    为什么我们需要 Buffer.isBuffer 方法?

  11. 11

    为什么我们需要在C#中装箱和拆箱?

  12. 12

    为什么我们到底需要Java中的StringBuffer

  13. 13

    为什么我们需要纯<?>在Java中?

  14. 14

    为什么我们在MongoDB中需要created_at

  15. 15

    为什么我们需要python中的协程?

  16. 16

    为什么我们需要Java中的Properties类?

  17. 17

    为什么我们需要Kubernetes中的服务帐户?

  18. 18

    为什么我们在芹菜中需要签名?

  19. 19

    为什么我们在git中需要SSH密钥?

  20. 20

    为什么我们需要Clojure中的'in(require'[...]])?

  21. 21

    为什么我们需要Java中的弱引用

  22. 22

    为什么我们在Python中需要“ finally”子句?

  23. 23

    为什么我们在Hadoop堆栈中需要ZooKeeper?

  24. 24

    为什么我们在Typescript中需要任何类型?

  25. 25

    为什么我们需要Python中的属性?

  26. 26

    为什么我们在区块链中需要 TLSNotary?

  27. 27

    为什么我们需要声明枚举变量?(C)

  28. 28

    为什么我们需要在此脚本中调用“ c.set.bind(c)”?

  29. 29

    为什么我们需要需求?

热门标签

归档