Oracle托管驱动程序可以正确使用异步/等待吗?

我试图使用async / wait .NETfunction进行Oracle查询。 结果集相当大,大约需要5-10秒才能恢复。 Window_Loaded挂起了UI线程,本质上我想使用async / wait在后台执行查询,然后使用结果更新数据视图。

这是Oracle驱动程序问题还是代码错误? 例如,这是同步而不是异步完成的事情吗? 我正在使用Oracle可以从Oracle网站获得的最新Oracle.ManagedDataAccess

 async Task AccessOracleAsync() { DataTable dt; using(OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString)) using (OracleCommand cmd = new OracleCommand(@"SELECT * FROM myTbl", conn)) { await conn.OpenAsync(); using (var reader = await cmd.ExecuteReaderAsync()) { dt = new DataTable(); dt.Load(reader); } } return dt; } private async void Window_Loaded(object sender, RoutedEventArgs e) { await AccessOracleAsync(); } 

我尝试了这个,它仍然是用户界面的死锁:

 async Task AccessOracleAsync() { DataTable dt; using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString)) using (OracleCommand cmd = new OracleCommand(@"SELECT * FROM myTbl", conn)) { await conn.OpenAsync().ConfigureAwait(false); using (DbDataReader reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false)) { dt = new DataTable(); await Task.Run(() => dt.Load(reader)).ConfigureAwait(false); } } return dt.AsDataView(); } private async void Window_Loaded(object sender, RoutedEventArgs e) { Data1.ItemsSource = await AccessOracleAsync(); } 

所以最后,我将方法更改为类似的东西,使其不会死锁。 看来我有正确的想法,只是Oracle Managed库同步实现了Async方法(只是为了符合接口)。

 private async Task AccessOracleAsync() { DataTable dt = new DataTable(); using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString)) using (OracleCommand cmd = new OracleCommand(@"SELECT * myTbl", conn)) { await Task.Run(() => { conn.Open(); using (DbDataReader reader = cmd.ExecuteReader()) { dt.Load(reader); } }).ConfigureAwait(false); } return dt.AsDataView(); } 

不。托管驱动程序不支持async / await

您可以调用这些方法,因为它们必须实现以符合接口定义,但代码实际上是同步的。 如果需要,可以使用Task.Run ,但不能同时进行两次调用(Oracle会威胁它们同步)。

(我将此作为答案,因为它似乎是让Oracle托管驱动程序正确支持异步的“解决方案”。)

我在甲骨文的网站上发现了一个旧的线程 (来自2010年),甲骨文公司表示他们不支持它。 您可以投票 (必须拥有Oracle帐户)才能包含该function。 5年后,遗憾的是只获得了60票。