【发布时间】:2018-04-24 02:28:48
【问题描述】:
我正在查看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 中)。我仍然不喜欢它,但这是我的问题。
【问题讨论】:
-
几个提供者(包括流行的)不支持与他们的数据库真正的异步通信,所以他们只是继承了这个实现。那些这样做的人 - 覆盖并提供真正的实施。是的,这些方法可以被抽象化,但另一个设计决定是不强制不支持这些方法的提供者提供他们自己的虚假实现。
标签: c# async-await system.data dbdatareader