2

Naturally-asynchronous operations are not CPU bound and don't have a thread. For example, file reads are done in the I/O hardware which can be kicked off asynchronously without a thread, enabling concurrency. Whenever I come across resources that discuss this, they always use external-system-bound operations as examples, and they almost always have "like I/O or database operations".

ADO.NET has plenty of async methods, like SqlCommand.ExecuteReaderAsync, but one thing it doesn't have is System.Data.SqlClient.SqlDataAdapter.FillAsync.

Many resources covering this happily suggest that you just use Task.Run, like this one and this one, e.g.:

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;
        }
    });
}

But that code isn't truly asynchronous: there's still a thread.

So was it an intentional decision not to have FillAsync, and if so, why?

rory.ap
  • 34,009
  • 10
  • 83
  • 174
  • 2
    I suppose because this is legacy api. Most of them never got async upgrades. Because there are modern alternatives, like EF - which has async all the way around. – ZorgoZ Jul 30 '18 at 16:27

0 Answers0