有人可以向我解释为什么这在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的结果
答案 0 :(得分:1)
有人可以向我解释为什么这在SQL中是异步的,但不在OleDb中吗?
无论是否实现异步方法,它都取决于ADO.NET提供程序。如果提供者不支持异步,则异步方法只是同步运行。
也许如何解决它。
如果你的真实应用程序在ASP.NET上,只需继续异步调用它们;它们会同步运行,但是您无法做任何事情,如果将来它们进行升级以支持异步,您的代码将自动使用该新功能。
如果您的真实应用程序是UI应用程序,那么您需要将数据库代码包装在后台线程中(例如,Task.Run
)。在这种情况下,是否使用异步或同步API取决于您;无论哪种方式,我一定要留下评论,说明ADO.NET提供商同步执行,这就是为什么它在后台线程中。