Oracle OpenAsync等...不是真正的异步方法吗?

问题描述

我有一个要通过ODP.NET访问的Oracle数据库

这是我的演示代码

public static async Task<Field[][]> ReadAsync(string Extractsql)
{
    var connStr = ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString;
    List<Field[]> ret = new List<Field[]>();
    using (OracleConnection conn = new OracleConnection(connStr))
    {
        await conn.OpenAsync();
    }
    return ret.ToArray();
}

代码表现为异步,UI完全被阻塞了几秒钟。 如果我只是替换

await Task.Delay(10000); //conn.OpenAsync();

一切正常。 我可以得出结论,这是 ODP.NET 中的 bug ,是否存在github存储库,或者在哪里可以报告它,或者我缺少C#异步中的琐碎内容?>

还有其他人使用.NET for Oracle并在异步方法方面遇到类似的问题吗?

请注意

我当然已经在其中添加代码以打开命令并读取数据,问题仍然存在,这里我展示的是足以检测问题的最小代码。例如。我有一个可以阻止连接的防火墙,在这种情况下,它会超时,因此,如果数据库未连接,则唯一的“打开”命令可以足够以使应用卡住部分是异步

解决方法

谢谢@madreflection的评论。我真的很高兴删除我的答案,并接受他的回答。

无论如何,现在通过查看Visual Studio intellisense可以清楚地看到这些异步方法不存在,但是它们是从通用System.Data.Common.DbConnection继承而来的。

我在第一种不返回TaskTask<bool>的方法上也应该理解它,即从下一行返回

OracleDataReader DR = (OracleDataReader) await cmd.ExecuteReaderAsync();

我被迫在其中添加了意外的演员表(现在我明白了原因)。

因为我不能阻止UI,所以将API封装在Task.Run中。

用鼠标悬停在OpenAsync上,看下面的屏幕截图。

enter image description here

doc you can read

这是Open()的异步版本。提供者应使用适当的实现重写 默认实现将调用同步Open()调用并返回已完成的任务。

我个人认为默认实现会做错/误导性的事情,我宁愿抛出一个“未实现”的异常。