【发布时间】:2017-08-23 19:17:19
【问题描述】:
我正在使用 .NET Core 2.0。我有以下函数调用IDbCommand.ExecuteReader
public async Task<IEnumerable<Widget>> ReadAllAsync(
System.Data.IDbConnection databaseConnection,
System.Data.IDbTransaction databaseTransaction)
{
var commandText = "SELECT WidgetId, Name FROM Widget";
// _databaseCommandFactory.Create returns an IDbCommand
var command = this._databaseCommandFactory.Create(databaseConnection, databaseTransaction, commandText);
using (var dataReader = command.ExecuteReader())
{
// iterate through the data reader converting a collection of Widgets (`IEnumerable<Widget>`)
}
}
我收到警告
此异步方法缺少“等待”运算符,将同步运行。考虑使用 'await' 运算符来等待非阻塞 API 调用,或使用 'await Task.Run(...)' 在后台线程上执行 CPU 密集型工作。
我正在考虑按照警告中的建议将 command.ExecuteReader() 语句转换为 await Task.Run(() => command.ExecuteReader())。但我不确定这是正确的方法,我相信Task.Run(...) 是用于基于 CPU 的工作。这主要是 IO 工作。
所以我的问题是
-
Task.Run(...)是正确的方法吗? - 如果没有,是否有其他解决方案?
- 或者我应该暂时忽略警告并等到
ExecuteReaderAsync被添加到IDbCommand接口? (有这方面的计划吗?)
【问题讨论】:
-
IDbCommand不太可能很快得到ExecuteReaderAsync——它可能会破坏不支持异步/等待的现有实现。但是DbCommand确实有它,并且IDbCommand的所有框架实现都继承自它,因此转换它的风险不大。 -
我赞同 JeroenMostert 所说的。您始终可以检查 DbCommand,如果可行,将其强制转换,以便您可以访问异步成员。
-
你也可以考虑使用StackExchange.Dapper
-
@Nkosi 我目前正在查看我可以按原样使用框架做些什么,即除非绝对必要,否则不引入第三方组件。到目前为止进展顺利。不过我会看看 Dapper。
-
您应该考虑使用 Dapper Micro ORM,因为它使使用 Ado.net 变得更加简单,并且提供了所有 Async 选项。甚至不必担心打开/关闭连接。
标签: c# asynchronous async-await .net-core-2.0