首页 / C# / c# – 异步odbc似乎是同步的
c# – 异步odbc似乎是同步的
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 异步odbc似乎是同步的,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2233字,纯文字阅读大概需要4分钟。
内容图文
![c# – 异步odbc似乎是同步的](/upload/InfoBanner/zyjiaocheng/789/2f1abd35581e4a55adb3e513e2e6dcda.jpg)
我正在尝试执行异步数据库查询,但是当我测试我的代码时,它似乎是同步的.我已将问题隔离到我的查询功能.无法弄清楚我做错了什么,我对aync / await功能很新,所以我可能做了一些愚蠢的事情:)
这是失败的代码:(我正在使用postgresql的本地安装)
public static void Main()
{
Task.Run(async () => await MainAsync()).GetAwaiter().GetResult();
}
public static async Task MainAsync()
{
await TestDbSleep(5);
}
public static async Task TestDbSleep(int seconds)
{
Console.WriteLine("{0} Starting tasks!", DateTime.Now.ToString("HH:mm:ss"));
var tasks = new[] { DbSleep(5, "first"), DbSleep(seconds, "second"), DbSleep(seconds, "third") };
Console.WriteLine("All tasks started!");
await Task.WhenAll(tasks);
Console.WriteLine("{0} All tasks done!", DateTime.Now.ToString("HH:mm:ss"));
}
public static async Task<DbDataReader> DbSleep(int seconds, string name)
{
Console.WriteLine("Starting {0}!", name);
var result = await Query("SELECT * FROM pg_sleep(?)", new OdbcParameter("seconds", seconds));
Console.WriteLine("{0} done!", name);
return result;
}
public static async Task<DbDataReader> Query(string sql, params OdbcParameter[] parameters)
{
using (var dbConn = new OdbcConnection(ConfigurationManager.ConnectionStrings["MainConnectionString"].ConnectionString))
{
await dbConn.OpenAsync();
var command = new OdbcCommand(sql, dbConn);
if (parameters != null)
{
foreach (var parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
return await command.ExecuteReaderAsync();
}
}
当我运行此代码时,我得到此输出:
09:29:20 Starting tasks!
Starting first!
first done!
Starting second!
second done!
Starting third!
third done!
All tasks started!
09:29:36 All tasks done!
为什么第二个和第三个任务不直接启动?为什么需要16秒?
我试图用等待Task.Delay(秒* 1000)替换对我的Query函数的调用,当我这样做时代码异步执行如下:
09:29:15 Starting tasks!
Starting first!
Starting second!
Starting third!
All tasks started!
third done!
second done!
first done!
09:29:20 All tasks done!
解决方法:
问题是我假设OdbcConnection.OpenAsync()和OdbcCommand.ExecuteReaderAsync()实际上是异步方法,它们不是.
我在msdn上读过如何使用SqlConnection和SqlCommand async,并且我可以将它应用于OdbcConnection / OdbcCommand,结果证明是假的.
我通过使用Npgsql:s NpgsqlConnection,NpgsqlCommand和NpgsqlParameter类而不是.NETs Odbc-classes来实现它.
内容总结
以上是互联网集市为您收集整理的c# – 异步odbc似乎是同步的全部内容,希望文章能够帮你解决c# – 异步odbc似乎是同步的所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。