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

hel*_*rld 5 c# async-await

为什么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
                }
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Tem*_*Tre 3

await将等待直到操作不执行。所以你有2个异步操作,这就是你需要使用await的原因。

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

所以,你有 3 个异步方法。你可以不等待就调用它,但它会崩溃。当您在不使用await的情况下调用它时,它将开始在另一个线程中执行,并且正在执行SeedAsync的线程不会等到InsertAsync执行完毕。它将同时启动第二个InsertAsync

因此,就您的情况而言,您可以插入值而无需等待。它会起作用的。但一般情况下最好使用await。因为操作顺序通常很重要。wait 允许控制操作顺序

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

  • 为什么会有暗恋呢? (2认同)