ExecuteXmlReaderAsync无法按预期工作

时间:2013-01-22 14:03:25

标签: 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);
}

如果您想使用异步方法,则将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是readonly所以它应该在创建对象时设置

1 个答案:

答案 0 :(得分:2)

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

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

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

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