質問: 私はHtmlAgilityPackを使って約200,000のHTML文書を解析しています。 私はこれらのドキュメントの内容を予測することはできませんが、そのようなドキュメントの1つが私のアプリケーションを`StackOverflowException`失敗させる原因になります。ドキュメントには次のHTMLが含まれています: ``` ... ``` 大体万があります``そのようにネストされた要素が。 HtmlAgilityPackがHTMLを解析するため、 `StackOverflowException`発生します。 残念ながら、StackOverflowExceptionは.NET 2.0以降ではキャッチできません。 私はスレッドのスタックのために大きなサイズを設定するのには不思議でしたが、より大きなスタックサイズを設定することはハックです:それは私のプログラムがもっと多くのメモリを使用するようになります(私のプログラムはHTMLを処理するために約50スレッドを開始するので、スタックサイズが大きくなります)、同様の状況に再び遭遇した場合は手動で調整する必要があります。 他の回避策がありますか?
回答: 理想的には、長期的な解決策は、HtmlAgilityPackにコールスタックの代わりにヒープスタックを使用するようにパッチを当てることですが、それは私には大きすぎる作業です。私は一時的に私のCodePlexアカウントの詳細を失ってしまいました。しかし、私がそれらを取り戻すと、私は問題に関する問題レポートを提出します。また、この問題により、HtmlAgilityPackを使用してユーザーが送信したHTMLをサニタイズするサイトにDoS攻撃の脆弱性が存在する可能性があることにも注意してください。 その間、私は、最大スレッドスタックサイズを手動でオーバーライドすることが最善の方法であると考えました。以前のステートメントでは、スタックサイズが大きいということは、すべてのスレッドが自動的にそのメモリを消費することを意味していました(メモリページは、スレッドスタックのために割り当てられているようです。 私は``ページのコピーを作り、いくつかの実験を行った。スタックサイズが`2^21`バイト未満で、 `2^22`最大サイズが成功しました。これは4MBで、私の本では "受け入れ可能な"ハックとして渡されています。