C# 异步访问与异步SQL
有人能解释一下为什么这在SQL中是异步的,而在OleDb中不是 也许该怎么修 SQLC# 异步访问与异步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 = @" ... ";
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组件的访问放弃了异步支持。