IDbCommand 缺少 ExecuteReaderAsync
IDbCommand missing ExecuteReaderAsync
我正在使用 .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>`)
}
}
我收到警告
This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.
我正在考虑按照警告中的建议将 command.ExecuteReader()
语句转换为 await Task.Run(() => command.ExecuteReader())
。但我不确定这是正确的方法,我相信 Task.Run(...)
是为了做基于 CPU 的工作。这主要是 IO 工作。
所以我的问题是
Task.Run(...)
是正确的方法吗?
- 如果不行,还有其他解决办法吗?
- 或者我应该暂时忽略警告,等到
ExecuteReaderAsync
被添加到 IDbCommand
界面? (有这方面的计划吗?)
await
关键字允许方法异步 运行。 async
关键字允许在方法中使用 await
关键字并协助管理 return.
直到 await
被调用,该方法将 运行 同步。
所以所有这些 运行 都是同步的。它不会 return 任何东西,也不会在方法完成之前移动。
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>`)
}
}
通过转换为 DbCommand
,大多数 IDbCommand
派生的实现已经这样做,然后转换为 DbCommand
并添加 await 就可以了,例如
var dbCommand = (DbCommand) command;
using (var dataReader = await dbCommand.ExecuteReaderAsync())
{
while (await dataReader.ReadAsync())
{
// iterate through the data reader converting a collection of Widgets (`IEnumerable<Widget>`)
}
}
或创建一个单独的任务
public async Task MyAsyncMethod()
{
// Do your stuff that takes a long time
}
public async Task CallMyAsyncMethod()
{
// We can await Tasks, regardless of where they come from.
await MyAsyncMethod();
}
这样 - 程序将继续等待来自此方法的 return,而不是锁定 UI 和其他所有内容。
我正在使用 .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>`)
}
}
我收到警告
This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.
我正在考虑按照警告中的建议将 command.ExecuteReader()
语句转换为 await Task.Run(() => command.ExecuteReader())
。但我不确定这是正确的方法,我相信 Task.Run(...)
是为了做基于 CPU 的工作。这主要是 IO 工作。
所以我的问题是
Task.Run(...)
是正确的方法吗?- 如果不行,还有其他解决办法吗?
- 或者我应该暂时忽略警告,等到
ExecuteReaderAsync
被添加到IDbCommand
界面? (有这方面的计划吗?)
await
关键字允许方法异步 运行。 async
关键字允许在方法中使用 await
关键字并协助管理 return.
直到 await
被调用,该方法将 运行 同步。
所以所有这些 运行 都是同步的。它不会 return 任何东西,也不会在方法完成之前移动。
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>`)
}
}
通过转换为 DbCommand
,大多数 IDbCommand
派生的实现已经这样做,然后转换为 DbCommand
并添加 await 就可以了,例如
var dbCommand = (DbCommand) command;
using (var dataReader = await dbCommand.ExecuteReaderAsync())
{
while (await dataReader.ReadAsync())
{
// iterate through the data reader converting a collection of Widgets (`IEnumerable<Widget>`)
}
}
或创建一个单独的任务
public async Task MyAsyncMethod()
{
// Do your stuff that takes a long time
}
public async Task CallMyAsyncMethod()
{
// We can await Tasks, regardless of where they come from.
await MyAsyncMethod();
}
这样 - 程序将继续等待来自此方法的 return,而不是锁定 UI 和其他所有内容。