当前位置: 首页 > 编程语言 > C#

Oracle托管驱动能否正确使用async-await?分享

时间:2023-04-11 03:14:22 C#

OracleManagedDriver能否正确使用async/await?我正在尝试对Oracle查询使用异步/等待.NET功能。结果集相当大,恢复大约需要5-10秒。Window_Loaded挂起UI线程,本质上我想使用异步/等待在后台执行查询,然后用结果更新数据视图。这是Oracle驱动程序问题还是代码中的错误?例如,这是同步完成的而不是异步完成的吗?我正在使用Oracle网站提供的最新Oracle.ManagedDataAccess。异步任务AccessOracleAsync(){DataTabledt;使用(OracleConnectionconn=newOracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString))使用(OracleCommandcmd=newOracleCommand(@"SELECT*FROMmyTbl",conn)){awaitconn.OpenAsync();使用(varreader=awaitcmd.ExecuteReaderAsync()){dt=newDataTable();dt.Load(阅读器);}}返回dt;}privateasyncvoidWindow_Loaded(objectsender,RoutedEventArgse){awaitAccessOracleAsync();我尝试了这个,它仍然是用户界面的死锁:asyncTaskAccessOracleAsync(){DataTabledt;使用(OracleConnectionconn=newOracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString))使用(OracleCommandcmd=newOracleCommand(@"SELECT*FROMmyTbl",conn)){awaitconn.OpenAsync().ConfigureAwait(false);使用(DbDataReaderreader=awaitcmd.ExecuteReaderAsync().ConfigureAwait(false)){dt=newDataTable();awaitTask.Run(()=>dt.Load(reader)).ConfigureAwait(false);}}返回dt.AsDataView();}privateasyncvoidWindow_Loaded(objectsender,RoutedEventArgse){Data1.ItemsSource=awaitAccessOracleAsync();所以最后,我把方法改成了这样,这样就不会死锁了,看来我的想法是对的,只是OracleManaged库同步实现了Async方法(只是为了符合接口).私有异步任务AccessOracleAsync(){DataTabledt=newDataTable();使用(OracleConnectionconn=newOracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString))使用(OracleCommandcmd=newOracleCommand(@"SELECT*myTbl",conn)){awaitTask.Run(()=>{conn.Open();使用(DbDataReaderreader=cmd.ExecuteReader()){dt.Load(reader);}}).ConfigureAwait(false);}返回dt。作为数据视图();否。托管驱动程序不支持异步/等待。您可以调用这些方法,因为必须实现它们以符合接口定义,但代码实际上是同步的。如果需要,可以使用Task.Run,??但不能同时调用两个调用(Oracle威胁它们要同步)。(我把它作为一个答案,因为它似乎是让Oracle托管驱动程序正确支持异步的“解决方案”。)我在Oracle的网站上发现了一个旧线程(从2010年开始),Oracle说他们不支持它。您可以投票(您必须拥有Oracle帐户)以包含该功能。5年后,遗憾的是只拿到了60票。以上是C#学习教程:Oracle托管驱动能否正确使用async/await?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: