为什么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] 删除。
我来说两句