相关疑难解决方法(0)

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

我试图使用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)) …
Run Code Online (Sandbox Code Playgroud)

.net c# oracle async-await odp.net-managed

22
推荐指数
3
解决办法
6272
查看次数

如何使SqlDataReader.ReadAsync()异步运行?

实际执行需要时间的SQL Server调用时,SqlDataReader.ReadAsync()对我来说是同步运行的。有什么方法可以强制它异步运行,还是我调用它的唯一选择Task.Run()

这是一个复制品。它使用winforms演示该调用阻塞了GUI线程。请注意,T-SQL必须实际执行某项操作-使用不能重现WAITFOR DELAY '00:00:20'

using System;
using System.Configuration;
using System.Data.Common;
using System.Data.SqlClient;
using System.Threading.Tasks;
using System.Windows.Forms;

static class SqlDataReaderReadAsyncProgram
{
    static async void Form_Shown(object sender, EventArgs e)
    {
        var form = (Form)sender;
        // Declare your connection string in app.config like
        // <connectionStrings><remove name="LocalSqlServer"/><add name="LocalSqlServer" connectionString="Data Source=localhost\SQLEXPRESS;Integrated Security=true"/></connectionStrings>
        using (DbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[0].ConnectionString))
        {
            form.Text = "connecting…";
            await connection.OpenAsync();
            form.Text = "connected!";
            // Install a stored procedure.
            using (var command = connection.CreateCommand()) …
Run Code Online (Sandbox Code Playgroud)

c# ado.net sqlclient task-parallel-library

5
推荐指数
1
解决办法
1357
查看次数