1

ユーザーがロードした単語のリストを使用して、サイトで複数の検索を実行し、結果の各ページを解析するクローラーを作成しました。

これを実現するために、単語のリストをループし、(ThreadPool.QueueUserWorkItem を使用して) 複数の http get 要求を非同期的に送信して、結果が見つからなくなるまで現在の単語の結果のすべてのページを取得し、次に移動する main メソッドを作成しました。次の言葉へ。

コールバック関数は、返された html を解析し、それに応じて動作する静的メソッドを使用して public static クラスにアクセスします。現在、何かがメソッドにアクセスするたびにクラス型をロックしています。

    static class Parser
{
    public static string ResponseAsString(HttpWebResponse response)
    {
        lock (typeof(Parser))
        {
            try
            {
                Stream stream;
                if (response == null || (stream = response.GetResponseStream()) == null) return string.Empty;
                using (var sr = new StreamReader(stream))
                    return sr.ReadToEnd();
            }
            catch { return string.Empty; }
        }
    }

    public static void CallbackMethod_ParseData(string html)
    {
        lock (typeof(Parser))
        {
            //Do some work here
        }
    }
}

私の質問は次のとおりです。クラスをより効率的にロックし、ロックが解除されたときに待機中のスレッドに通知するにはどうすればよいですか、または Parser を静的クラスにせずに、各 ThreadPool スレッドにこのクラスの独自のインスタンスをインスタンス化させる必要がありますか?

ご協力ありがとうございました。

-まだ学習中

4

2 に答える 2

1

ロックは必要ありません。静的メソッドは、静的データを共有していない限りスレッドセーフですが、あなたの例によればそうではありません。

于 2012-05-22T16:51:32.777 に答える
1

あなたのコードを見ると、ロックする理由はまったくないと思います。

于 2012-05-22T16:52:11.240 に答える