Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步访问与异步SQL_C#_Sql_Sql Server_Ms Access_Asynchronous - Fatal编程技术网

C# 异步访问与异步SQL

C# 异步访问与异步SQL,c#,sql,sql-server,ms-access,asynchronous,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 = @" ... ";

有人能解释一下为什么这在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中,只是打印结果


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


来自SQL的结果

有人能解释一下为什么这在SQL中是异步的,而在OleDb中不是

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

也许该怎么修

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


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

你说“如何修复它”。需要解决什么问题?这些问题都没有等待解决,因此它们都不应该是异步的。它们将在同一个平台上运行thread@Jaxi,欢迎您自己尝试。@SeanLange,对不起,我想让OleDb异步。我想,但我现在没有一个环境来测试它:)但是您可以在那里
同时!task.iscompleted
阻止控制台线程写入hmmThank you。不只是抛出未经处理的异常,感觉是违反直觉的。我有一个oledb适配器,我可以在其中隐藏一些异步调用,因为我不需要wsnt任务。这是一个用户界面应用程序(仅适用于以下情况):您是否有任何文档证明tjis特定的提供程序没有实现异步?只是为了奖励积分;)@克里斯沃勒:不,对不起。我只知道体系结构是如何工作的,而不知道具体的实现。SQL肯定是异步兼容的,他们决定不升级Oracle,SQLite也不是异步的。在您的情况下,我不确定是OleDb-for-ADO.NET还是OleDb组件的访问放弃了异步支持。