gpt4 book ai didi

c# - System.Data.Common.DbDataReader.ReadAsync 中的异步是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:20 25 4
gpt4 key购买 nike

我在 MS reference 查看 DbDataReader(也称为 DbCommand)的代码并且无法弄清楚 ReadAsync() 方法中的异步是什么。

    virtual public Task<bool> ReadAsync(CancellationToken cancellationToken) {
if (cancellationToken.IsCancellationRequested) {
return ADP.CreatedTaskWithCancellation<bool>();
}
else {
try {
return Read() ? ADP.TrueTask : ADP.FalseTask;
}
catch (Exception e) {
return ADP.CreatedTaskWithException<bool>(e);
}
}
}

ReadAsync 方法只是调用 Read 方法并返回一个完整的任务。这不是像直接调用Read一样阻塞调用线程吗?

我注意到 DbCommand ExecuteReaderAsync 和其他方法中存在相同的模式。他们只是调用同步版本并返回已完成的任务。

我在这里错过了什么?

更新:我没有遗漏任何东西,@PeterBons 解释得很好(也在 the documentation 中)。我仍然不喜欢它,但这是我的问题。

最佳答案

您正在查看抽象类中的虚方法。如果您希望( future 的)实现能够完成一些真正的异步工作,您将必须定义一个允许这样做的方法签名。所以它应该返回 TaskTask<T> .请记住,仅使用 Task 不会使任何事情异步,而是使其可等待。

Task<bool>的使用此示例虚拟方法中的返回类型是为了促进从 DbDataReader 派生的其他类在其 ReadAsync 实现中提供真正的异步行为。

例如,一个真正的异步实现可以做类似的事情

class TrueAsyncReader : DbDataReader
{
...

public override async Task<bool> ReadAsync(CancellationToken cancellationToken)
{
...

return await ReadFromDbAsync();
}
}

如您所见,您现在可以拥有异步和非异步实现,而无需更改方法签名。

因为您可以轻松地从异步方法调用同步代码,所以这是可行的方法。从同步方法调用异步代码很简单。

对于需要返回任务的非异步实现,您可以返回类似 Task.FromResult<T> 的内容或 Task.CompletedTask .这不会阻塞。

另见 await Task.CompletedTask for what?

总结一下:默认实现不执行任何异步操作,但派生类可以在不更改方法签名的情况下执行。

关于c# - System.Data.Common.DbDataReader.ReadAsync 中的异步是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47229906/

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