我正在尝试使用.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所以它应该在创建对象时设置
答案 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。