Kev*_*don 7 c# asynchronous async-await .net-core-2.0
我正在使用.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>`)
}
}
Run Code Online (Sandbox Code Playgroud)
我收到警告
这种异步方法缺少"等待"运算符并将同步运行.考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作.
我正考虑将command.ExecuteReader()声明转换await Task.Run(() => command.ExecuteReader())为警告中的建议.但我不确定这是正确的方法,我相信Task.Run(...)是基于CPU的工作.这主要是IO工作.
所以我的问题是
Task.Run(...)正确的方法吗?ExecuteReaderAsync添加到IDbCommand界面?(有计划吗?)该await关键字是允许的方法来异步运行.该async关键字,可以使用的await方法中的关键字,并在管理回报次助攻.
直到await被调用方法才会同步运行.
所以这一切都是同步运行的.在完成之前,它不会返回任何内容或移动方法.
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>`)
}
}
Run Code Online (Sandbox Code Playgroud)
通过转换到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>`)
}
}
Run Code Online (Sandbox Code Playgroud)
或创建一个单独的任务
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();
}
Run Code Online (Sandbox Code Playgroud)
这样 - 程序将在等待从此方法返回时继续,而不是锁定UI和所有其他内容.