为什么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语句而不是一个。
await将等待直到操作不执行。所以你有2个异步操作,这就是你需要使用await的原因。
await每个异步操作(方法)一个。
所以,你有 3 个异步方法。你可以不等待就调用它,但它会崩溃。当您在不使用await的情况下调用它时,它将开始在另一个线程中执行,并且正在执行SeedAsync的线程不会等到InsertAsync执行完毕。它将同时启动第二个InsertAsync
因此,就您的情况而言,您可以插入值而无需等待。它会起作用的。但一般情况下最好使用await。因为操作顺序通常很重要。wait 允许控制操作顺序
有时您需要运行一些任务,然后等待所有任务。然后你可以使用Task.WhenAll(t1,t2,t3)