c# - ExecuteXmlReaderAsync 未按预期工作

标签 c# xml .net-4.5 async-await

我正在尝试使用 .NET 4.5 中的新异步方法从 MSSQL 读取 XML。

我有以下代码

var xmlReader = await sqlCommand.ExecuteXmlReaderAsync();

while (await xmlReader.ReadAsync())
{
    var doc = (MyDocument)xmlSerializer.Deserialize(xmlReader);
    await Process(doc);
}

如果您想使用异步方法,它会因 Set XmlReaderSettings.Async to true 而失败。

我检查了 ExecuteXmlReaderAsync 的反编译源,我可以看到它使用了以下设置之一:

private static readonly XmlReaderSettings DefaultXmlReaderSettings = new XmlReaderSettings()
{
  ConformanceLevel = ConformanceLevel.Fragment
};
private static readonly XmlReaderSettings DefaultXmlReaderSettingsCloseInput = new       XmlReaderSettings()
{
  ConformanceLevel = ConformanceLevel.Fragment,
  CloseInput = true
};

所以看起来 ExecuteXmlReaderAsync 没有很好地实现。

如果您有成功使用此方法的经验,请提出建议。

UPD:xmlReader.Settings.Async 是只读的,因此应在创建对象时设置

最佳答案

我认为您对这个问题的根源完全正确。如果我使用反射来更改您提到的私有(private)字段中的设置,它似乎可以工作。

var settingsField = typeof(SqlXml)
    .GetField("DefaultXmlReaderSettingsCloseInput",
              BindingFlags.Static | BindingFlags.NonPublic);
var settings = (XmlReaderSettings)settingsField.GetValue(null);
settings.Async = true;

请注意,这是一个肮脏的 hack,它可能随时停止工作。而且我真的不知道我在做什么,所以这实际上可能无法正常工作,或者可能会产生一些意想不到的后果。因此,我在使用它时会非常小心。

另外,我认为你应该report this as a bug to Microsoft .

关于c# - ExecuteXmlReaderAsync 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14460378/

相关文章:

c# - NUnit:无法加载文件或程序集 'some.dll' 或其依赖项之一。指定的模块无法找到

java - 我的应用程序无法编译,当它抛出错误时,我所有的资源文件都消失了

python - 对象/XML 向后兼容性

c# - IList<T> 和 IReadOnlyList<T>

.net 4.0 上的 ASP.NET Web API

c# - 修复流式 USB 数据中的差距

c# - If value in range(x,y) 函数 c#

java - 无法使用 JAXB 生成枚举类

c# - 参数类型 'A' 不能分配给类型 'B'?

c# - EF Core IdentityDbContext 中的 SaveChangesAsync