问题描述
这是我的演示代码
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
继承而来的。
我在第一种不返回Task
或Task<bool>
的方法上也应该理解它,即从下一行返回
OracleDataReader DR = (OracleDataReader) await cmd.ExecuteReaderAsync();
我被迫在其中添加了意外的演员表(现在我明白了原因)。
因为我不能阻止UI,所以将API封装在Task.Run
中。
用鼠标悬停在OpenAsync
上,看下面的屏幕截图。
这是Open()的异步版本。提供者应使用适当的实现重写 默认实现将调用同步Open()调用并返回已完成的任务。
我个人认为默认实现会做错/误导性的事情,我宁愿抛出一个“未实现”的异常。