0

これはASP.NET用です。関数の実行にかかる時間を改善したいのですが、今日は20〜30秒かかりますが、20秒よりも30秒になります。これは1つのスレッドで実行され、20のWebリクエストを作成します。

結果をすばやく見つけるため、またはデータを調べるために、20個すべてのwebreqeustを実行するスレッドを考えています(つまり、20個すべての要求を実行して何も見つかりません)。


仕組みは次のとおりです。
1.htmlドキュメントをフェッチするためにhtmlアジリティパックを使用しています。
2.次に、それらを解析して情報を取得します。3
.最後に、その情報を辞書に追加するか、 20件のリクエストに達するまで次のWebリクエストに進みます。

私は最大20のwebRequestを作成します。少なくとも1つです。検索している情報が見つかったときに終了するように関数を設定しました。時々情報がそこにないので、20のwebrequests(それはすべてのデータを通過します)。

すべてのWebリクエストは、辞書に5〜20のエントリを追加します。次に、これを送信した情報と比較します。リストに含まれている場合はキーを取得し、そうでない場合は201を返します。見つかった場合はデータベースに追加されます。

質問

* A:*スレッドでこれを実行したい場合、いくつ作成する必要がありますか?20リクエストごとに1つ、すべてを解放して仕事をしますか?または、それぞれ最大5つのリクエストを行う4つのように作成する必要がありますか?

B: 2つのスレッドが同時に終了し、ディレクトリに情報を追加したい場合、サイト全体をロックできますか(ASP.NETを使用しています)、スレッドAから1つ追加してから、1つ追加しようとしますか?スレッドBの結果ですか?キーを追加する前にキーが存在するかどうかをチェックするチェックが今日すでにあります。

C:これへの最速の方法は何でしょうか?

これは私のコードで、20個のリクエストが行われていることを示すループを示していますか?

public void FetchAndParseAllPages()
    {

        int _maxSearchDepth = 200;
        int _searchIncrement = 10;

        PageFetcher fetcher = new PageFetcher();
        for (int i = 0; i < _maxSearchDepth; i += _searchIncrement)
        {
            string keywordNsearch = _keyword + i;
            ParseHtmldocuments(fetcher.GetWebpage(keywordNsearch));

            if (GetPostion() != 201)
            {   //ADD DATA TO DATABASE
                InsertRankingData(DocParser.GetSearchResults(), _theSearchedKeyword);
                return;
            }
        }
    }
4

1 に答える 1

2
  1. .NETでは、同時に開くことができるリクエストは2つだけです。それ以上が必要な場合は、web.configで構成する必要があります。ここを見てください:http://msdn.microsoft.com/en-us/library/aa480507.aspx

  2. Parallel.For非常に簡単で、「スレッド数」を処理する方法を使用できます。もちろん、それを微調整して、必要なスレッド(またはタスク)の数を設定することもできますParallelOptions。ここを見てください:http://msdn.microsoft.com/en-us/library/dd781401.aspx

  3. スレッドセーフな辞書を作成するには、を使用できますConcurrentDictionary。ここを見てください:http://msdn.microsoft.com/en-us/library/dd287191.aspx

于 2012-11-04T16:45:15.257 に答える