异步访问与异步SQL

时间:2017-07-24 13:40:41

标签: c# sql sql-server ms-access asynchronous

有人可以向我解释为什么这在SQL中是异步的,但不在OleDb中吗?

也许如何修复它。

SQL

static void Main(string[] args)
{
    var task = Run();
    while(!task.IsCompleted)
        Console.WriteLine("Hmm");
    task.Wait();
}

private static async Task Run()
{
    string conString = @" ... ";
    var con = new SqlConnection(conString);
    con.Open();
    using(var command = new SqlCommand("SELECT * FROM Products2;", con))
    {
        command.Parameters.Add(new SqlParameter("p", 337));
        using(var reader = await command.ExecuteReaderAsync())
            while(await reader.ReadAsync())
                Console.WriteLine(reader.GetString(2));
    }
}

使用

    static void Main(string[] args)
    {
        var task = Run();
        while(!task.IsCompleted)
            Console.WriteLine("Hmm");
        task.Wait();
    }

    private static async Task Run()
    {
        string conString = @" ... ";
        var con = new OleDbConnection(conString);
        con.Open();
        using(var command = new OleDbCommand("SELECT * FROM Products2;", con))
        {
            command.Parameters.Add(new OleDbParameter("p", 337));
            using(var reader = await command.ExecuteReaderAsync())
                while(await reader.ReadAsync()) //Note - Calling Async
                    Console.WriteLine(reader.GetString(2));
        }
    }

因此,您不必自己复制,在执行SQL期间,它会并排打印结果和"Hmm"。在OleDb中只打印结果。

我可以通过包装await Task.Run(() => Console.WriteLine(reader.GetString(2)));修复,但这只会产生其他错误。

SQL的结果

Result from SQL

1 个答案:

答案 0 :(得分:1)

  

有人可以向我解释为什么这在SQL中是异步的,但不在OleDb中吗?

无论是否实现异步方法,它都取决于ADO.NET提供程序。如果提供者不支持异步,则异步方法只是同步运行。

  

也许如何解决它。

如果你的真实应用程序在ASP.NET上,只需继续异步调用它们;它们会同步运行,但是您无法做任何事情,如果将来它们进行升级以支持异步,您的代码将自动使用该新功能。

如果您的真实应用程序是UI应用程序,那么您需要将数据库代码包装在后台线程中(例如,Task.Run)。在这种情况下,是否使用异步或同步API取决于您;无论哪种方式,我一定要留下评论,说明ADO.NET提供商同步执行,这就是为什么它在后台线程中。