【问题标题】:Asynchronous Access vs Asynchronous SQL异步访问与异步 SQL
【发布时间】:2017-07-24 13:40:41
【问题描述】:

有人可以向我解释一下为什么这在 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 的结果

【问题讨论】:

  • 你说“如何解决它”。需要修复什么?
  • 没有等待,因此这些都不应该是异步的。它们都将在同一个线程上运行
  • @Jaxi,欢迎您自己尝试。
  • @SeanLange,对不起,我想让 OleDb 异步。
  • 我会,但我目前没有测试它的环境:) 但是你在哪里 while !task.iscompleted 阻止控制台线程写入嗯

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


【解决方案1】:

有人可以向我解释一下为什么这在 SQL 中是异步的,而在 OleDb 中却不是?

是否实现异步方法取决于 ADO.NET 提供程序。如果提供者不支持异步,那么异步方法只会同步运行。

请问如何解决。

如果您的真实应用程序在 ASP.NET 上,只需继续异步调用它们即可;它们将同步运行,但您对此无能为力,如果将来升级它们以支持异步,您的代码将自动使用该新功能。

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

【讨论】:

  • 谢谢。不只是抛出未实现的异常感觉违反直觉。我有一个 oledb 适配器,我可能能够隐藏一些异步调用,因为我没有 wsnt Task.Run 也执行 sql。不幸的是,它是一个 UI 应用程序。 :)
  • 您是否知道任何证明 tjis 特定提供程序未实现异步的文档?只是为了奖励积分;)
  • @ChrisWohlert:不,抱歉。我只知道架构是如何工作的,而不是具体的实现。 SQL 肯定是异步兼容的,他们决定升级 Oracle 版本,SQLite 也不是异步的。在您的情况下,我不确定是 OleDb-for-ADO.NET 还是 Access-for-OleDb 组件放弃了异步支持。
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多