返回 Task.CompletedTask 与 void

问题描述 投票:0回答:1

我正在浏览一个在线视频,作者有以下代码:

public async Task CreateBookAsync(BookDto newBook)
{
    var book = new Book(newBook.Id, newBook.Title, newBook.Author, newBook.Price);

    await _bookRepository.AddAsync(book);
    await _bookRepository.SaveChangesAsync();
}

书籍存储库:

public Task AddAsync(Book book)
{
    _dbContext.Add(book);
    return Task.CompletedTask;
}

public async Task SaveChangesAsync()
{
    await _dbContext.SaveChangesAsync();
}

我不确定为什么

AddAsync
返回一个任务而不只是无效,为什么要返回
Task.CompletedTask
?是不是因为
CreateBookAsync
正在使用
async Task
,所以将所有方法保留在使用
Task
内是有益的?如果它只是返回
void
然后将
await
从调用者方法中删除,会有什么不同吗?

c# .net async-await
1个回答
0
投票

我不确定为什么

AddAsync
返回一个任务而不只是无效,为什么要返回
Task.CompletedTask

我想到两个可能的原因:

  1. BookRepository
    类实现了一个具有
    AddAsync
    方法的接口。
    BookRepository.AddAsync
    的实现无法真正实现异步,因为(大概)
    _dbContext
    不提供
    Add
    的异步版本。因此,实现者可以选择同步实现它或公开异步包装器,明智地选择前者,因为后者是邪恶的

  2. BookRepository
    类是预计会发展的库的一部分。该库的作者预计
    _dbContext
    将在不久的将来获得异步
    Add
    的能力。他们决定不公开具有同步签名的
    Add
    ,因为这样库的用户将使用此方法,并且他们的项目不会自动从包含
    _dbContext
    的新异步的库的未来版本中受益能力。他们选择公开具有异步签名的同步方法,因为他们正在考虑未来。

© www.soinside.com 2019 - 2024. All rights reserved.