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

发布于 2017-07-24 14:02:17
有人能向我解释一下为什么这在SQL中是异步的,而在OleDb中却不是异步的吗?
是否实现异步方法取决于ADO.NET提供程序。如果提供程序不支持异步,则异步方法只是同步运行。
也许是怎么修的。
如果您的实际应用程序在ASP.NET上,只需继续异步调用它们;它们将同步运行,但您无法对其做任何事情,如果将来升级以支持异步,您的代码将自动使用这种新功能。
如果您真正的应用程序是UI应用程序,那么您需要将数据库代码封装在后台线程(例如Task.Run)中。在这种情况下,这取决于您是使用异步API还是同步API;不管怎样,我肯定会留下一条注释,解释ADO.NET提供程序是同步执行的,这就是为什么它处于后台线程中。
https://stackoverflow.com/questions/45282217
复制相似问题