3

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

我有以下代码

var xmlReader = await sqlCommand.ExecuteXmlReaderAsync();

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

如果您想使用异步方法,它将失败并设置 XmlReaderSettings.Async 为 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 是只读的,因此应在创建对象时设置

4

1 回答 1

2

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

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

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

另外,我认为您应该将此作为错误报告给 Microsoft

于 2013-01-22T15:36:57.110 回答