【发布时间】: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