2012-03-28 20 views
4

私は一種のWebCrawlerをやっているので、リクエストの間にCookies状態を維持する必要があります。複数のHttpWebRequestsで同じCookieContainerを使用しても安全ですか?

新しいページをすべてダウンロードして、新しいHttpWebRequestインスタンスを作成しますが、同じCookieContainerを設定します。ページはクッキーの書き込みと読み取りができます。

安全に行うことはできますか? CookieContainerをサブクラス化せず、すべてのメソッドにロックを入れることはできません。

MSDNによれば、このクラスはスレッドセーフではありませんが、実際にはできますか? documentationによると

+0

どのように安全ですか? –

+0

あなたのスレッドの安全性について話しているようです(_locks_の使用に基づいています)、それは間違いありませんか? –

+0

はい、スレッドセーフについて –

答えて

4

:このタイプの

(Visual BasicではShared)すべてのパブリックstaticメンバーが 、スレッドセーフです。どのインスタンスメンバーもスレッド が安全であるとは保証されません。

したがって、複数のスレッド間で同じインスタンスを共有する場合は、適切なロックを確保する必要があります。しかし、CookieContainerクラスのメンバーは実際にあなたのコードでは操作されませんが、あなたが作成したさまざまなHttpWebRequestインスタンスから暗黙のうちに、適切に同期するのは簡単ではありません。目的とあなたがここで達成しようとしていると思われる並列性のレベル。

実際に問題が発生するかどうかは、別のトピックです。問題は、ドキュメント(および作成者)があなたに何らかの保証を提供していないことです。

0

実際には、ソースコードCookieContainerhereを見ると、それはドキュメントにもかかわらずスレッドセーフであるようです。

それを説明する素晴らしい答えです。

https://stackoverflow.com/a/18370195/5088793

あなたはCookieContainerの著者は、すべてのコードのこれらの収集・変更部分を中心にロック{}とSyncRootのを使用しての世話をしたことに気づくでしょう、と私はそのようなアプローチがあるとは思いません同時のシナリオには対応していません。

ので、一般的なルール

あなたが標準Any instance members are not guaranteed to be thread safe.マニュアルを参照してくださいと、ちょうどそこに停止し、ロックを自分で実装していません。リフレクションまたはreferencesource.microsoft.com(.NETクラス用)を使用して、スレッドセーフであるかどうかを確認します。

関連する問題