首页 > 解决方案 > 为什么 System.Data.SqlClient.SqlDataAdapter 没有 FillAsync 方法?

问题描述

自然异步操作不受 CPU 限制,也没有线程。例如,文件读取是在 I/O 硬件中完成的,可以在没有线程的情况下异步启动,从而实现并发。每当我遇到讨论此问题的资源时,它们总是使用外部系统绑定操作作为示例,并且它们几乎总是具有“类似 I/O 或数据库操作”。

ADO.NET 有很多异步方法,比如SqlCommand.ExecuteReaderAsync.,但它没有的一件事是System.Data.SqlClient.SqlDataAdapter.FillAsync.

许多涵盖此内容的资源都建议您只使用Task.Run,例如thisthis,例如:

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,如果是,为什么?

标签: c#.netasynchronousado.net

解决方案


推荐阅读