我正在尝试使用 .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/