0

Web サービスから大量の xml データを取得する必要があります。

このスニペットのように Task を使用して非同期リクエストを送信します

LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(10);
TaskFactory factory = new TaskFactory(lcts);
List<Task> tasks = new List<Task>();
...
tasks.Add(factory.StartNew(() => GetRecords(country, names)));
...
Task.WaitAll(tasks.ToArray());

Web サービスにはバックエンドで多くの作業が必要なため、多くのリクエストがタイムアウトになるか、Web サービスから一般的なエラーが発生します。

最初に LimitedConcurrencyLevelTask​​Scheduler の数を調整して、この問題を解決しようとしています。

一部の XML には 2Mb のサイズがあるため、XmlReader でストリームを読み取り、XmlNode node = new XmlDocument().ReadNode(reader);必要なデータに使用していますが、プログラムがクラッシュしたり、デッドループになったりすることがあります (原因は、Web サービスによる適切な xml 応答ではない可能性があります)。

レスポンス全体から直接 XDoc を作成する方が悪いと思います。

可能な信頼できる解決策を教えていただけますか?

前もって感謝します :)

4

1 に答える 1

0

不正な形式の XML が問題の原因である場合は、XML 応答を文字列としてのみクロールし、それらをローカルに保存/キューに入れて後続の処理を行う必要があります。これは、クロールされた XML を解析するときに受け取ったエラーの種類を確認できるため、時間の経過とともに改善できます。

Web サービスのタイムアウトの場合、タスクはしばらく一時停止し、後で再試行する必要があります。

[編集:] 再試行を処理するために、再試行の間に指数関数的に増加する間隔を使用できます (TCP/IP と同じように)。これにより、タイムアウトが非常に一時的なものであり、サーバーの負荷が軽減される場合に迅速な再接続が得られます。深刻な過負荷の場合は迅速に。

再試行間の間隔のシーケンスは、たとえば、1、2、4、8 秒、... 32 秒まで、または最大再試行間隔となる別の経験的な値にすることができます。

また、ダウンロードに失敗したエントリのバックログを維持する必要があります。タイムアウトが唯一の理由ではない可能性があります。

于 2012-05-22T09:24:02.420 に答える