3

.NET 4.5 の新しい非同期メソッドを使用して、MSSQL からの XML 読み取りを実装しようとしています。

次のコードがあります

var xmlReader = await sqlCommand.ExecuteXmlReaderAsync();

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

Async メソッドを使用する場合は、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 は読み取り専用であるため、オブジェクトの作成時に設定する必要があります

4

1 に答える 1

2

この問題の原因については、まさにあなたが正しいと思います。リフレクションを使用して、あなたが言及したプライベートフィールドの設定を変更すると、うまくいくようです。

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

これは汚いハックであり、いつでも機能しなくなる可能性があることに注意してください。そして、私は自分が何をしているのかよくわからないので、これは実際には正しく機能しないか、意図しない結果をもたらす可能性があります. そのため、これを使用するときは非常に注意します。

また、これをバグとして Microsoft に報告する必要があると思います。

于 2013-01-22T15:36:57.110 に答える