use*_*753 22 .net c# oracle async-await odp.net-managed
我试图使用async/wait .NET功能进行Oracle查询.结果集非常大,需要大约5-10秒才能恢复.Window_Loaded挂起了UI线程,本质上我想使用async/wait在后台进行查询,然后使用结果更新数据视图.
这是Oracle驱动程序问题还是代码错误?例如,这是同步而不是异步完成的事情吗?我正在使用Oracle.ManagedDataAccessOracle可以从Oracle网站获得的最新信息.
async Task<DataTable> 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();
}
Run Code Online (Sandbox Code Playgroud)
我试过这个,它仍然在用户界面陷入僵局:
async Task<DataView> 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();
}
Run Code Online (Sandbox Code Playgroud)
所以最后,我将方法更改为这样的方法,使其不会死锁.看来我有正确的想法,只是Oracle Managed库同步实现了Async方法(只是为了符合接口).
private async Task<DataView> 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();
}
Run Code Online (Sandbox Code Playgroud)
Pat*_*man 16
不.托管驱动程序不支持async/ await.
您可以调用这些方法,因为它们必须实现以符合接口定义,但代码实际上是同步的.您可以Task.Run根据需要使用,但不能同时进行两次调用(Oracle会威胁它们同步).
mas*_*son 10
(我将此作为答案,因为它似乎是让Oracle托管驱动程序正确支持异步的"解决方案".)
我在甲骨文的网站上发现了一个旧的线程(从2010年开始),Oracle PM表示他们不支持它.您可以投票(必须拥有Oracle帐户)以包含该功能.5年后,遗憾的是只获得了60票.
经过 10 多年的努力,Oracle 终于发布了支持 async/await 的托管驱动程序的开发(测试版)版本。
Github问题:
https://github.com/oracle/dotnet-db-samples/issues/144#issuecomment-1656674986
.NET Core 的 Nuget 包:
https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/23.2.0-dev
如果您想安装它,您需要在 Visual Studio 中启用预发布,因为它仅处于开发阶段(测试版)。
| 归档时间: |
|
| 查看次数: |
6272 次 |
| 最近记录: |