gpt4 book ai didi

c# - Oracle managed driver 能否正确使用 async/await?

转载 作者:IT王子 更新时间:2023-10-29 04:43:39 27 4
gpt4 key购买 nike

我正在尝试使用 async/await .NET 功能进行 Oracle 查询。结果集相当大,大约需要 5-10 秒才能返回。 Window_Loaded 挂起 UI 线程,本质上我想使用 async/wait 在后台执行查询,然后用结果更新数据 View 。

那么这是 Oracle 驱动程序问题还是代码错误?例如。这里的某些事情是同步完成的而不是异步完成的吗?我正在使用最新的 Oracle.ManagedDataAccess 我可以从 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();
}

我试过了,它仍然阻塞了 UI:

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();
}

所以最后,我把方法改成这样,让它不阻塞。看来我的想法是正确的,只是 Oracle 托管库同步实现了异步方法(只是为了符合接口(interface))。

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();
}

最佳答案

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

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

关于c# - Oracle managed driver 能否正确使用 async/await?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29016698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com