自然异步操作不受CPU限制,并且没有线程。例如,文件读取是在I / O硬件中完成的,可以在没有线程的情况下异步启动,从而实现并发。每当我遇到讨论此问题的资源时,它们总是使用外部系统绑定的操作作为示例,并且几乎总是具有“类似I / O或数据库操作”的功能。
ADO.NET具有许多异步方法,例如SqlCommand.ExecuteReaderAsync
,但它没有的是System.Data.SqlClient.SqlDataAdapter.FillAsync
。
许多涉及此问题的资源都建议您只使用Task.Run
,例如this one和this one,例如:
public Task<DataSet> GetDataSetAsync
(string sConnectionString, string sSQL, params SqlParameter[] parameters)
{
return Task.Run(() =>
{
using (var newConnection = new SqlConnection(sConnectionString))
using (var mySQLAdapter = new SqlDataAdapter(sSQL, newConnection))
{
mySQLAdapter.SelectCommand.CommandType = CommandType.Text;
if (parameters != null) mySQLAdapter.SelectCommand.Parameters.AddRange(parameters);
DataSet myDataSet = new DataSet();
mySQLAdapter.Fill(myDataSet);
return myDataSet;
}
});
}
但是该代码并不是真正的异步:还有一个线程。
因此,故意放弃FillAsync
是一个故意的决定吗?为什么?