gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:59:46 24 4
gpt4 key购买 nike

为什么我们需要不止一个 await C# 方法中的语句?

例如。 here我们有三个 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。因为通常操作顺序很重要。 await 允许控制操作顺序

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

关于c# - 为什么在 C# 方法中需要多个 `await` 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59083531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com