1

最近、Web サイトのリクエストを非同期に変換したところ、以前の約 3 倍の速度になりましたが、欠点を発見しました。説明させてください、ページに対して20の異なるリクエストを使用します。ページが読み込まれると、結果を解析し、それらを辞書に追加します。これが完了すると、辞書で提供したキーを確認し、情報が見つかったかどうかに関する情報を取得します。

非同期の前は、20 個のリクエストすべてを実行するときに約 30 秒かかりました。今日、私は約 7 秒で 20 のリクエストを実行しています。大幅な改善ですが....古いメソッドが最初のリクエストで情報を見つけた場合、2 秒以内に終了しました。この方法を使用すると、常に 7 秒かかります。

情報が見つかった時点ですべてを終わらせるにはどうすればよいですか?20 件すべてのリクエストを実行する代わりに。これがコードです。

編集WAITALLを削除しようとしましたが、パフォーマンスが低下しました。

public decimal GetWebpage(string urltovisit, string visitorurl, string information)
    {
        List<HtmlDocument> htmllist = new List<HtmlDocument>();
        System.Net.ServicePointManager.DefaultConnectionLimit = 10;
        FetchPageDelegate del = new FetchPageDelegate(FetchPage);
        List<IAsyncResult> results = new List<IAsyncResult>();
        List<WaitHandle> waitHandles = new List<WaitHandle>();
        _visitorUrl = visitorurl;
        _theSearchedinformation = information;

        for (int i = 0; i < 200; i += 10)
        {
            string url = urltovisit + i;
            IAsyncResult result = del.BeginInvoke(url, null, null);
            results.Add(result);
            waitHandles.Add(result.AsyncWaitHandle);
        }

        WaitHandle.WaitAll(waitHandles.ToArray());

        foreach (IAsyncResult async in results)
        {
            FetchPageDelegate pagedelagate = (async as AsyncResult).AsyncDelegate as FetchPageDelegate;
            //THIS FUNCTION PARSES AND ADDS THE RESULT TO A DICTIONARY
            DocParser.StartParse(pagedelagate.EndInvoke(async));

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

        }
        return 201;
      }

では、デリゲートの新しいリストを作成して、解析して辞書に追加するメソッドとクラスを実行する必要がありますか? または、待機ハンドルを使用して、結果が見つかったことを伝えることができますか? 私はここで本当に無知ですか?

4

1 に答える 1

0

元に戻すハンドラー コレクションを使用し、フラグを返します。


var done=false
var index = WaitHandle.WaitAny(waitHandles.ToArray());
while(!done)
{
  var async=waitHandles.ElementAt(index);
  WaitHandle.RemoveAt(index);
  FetchPageDelegate pagedelagate = (async as AsyncResult).AsyncDelegate as FetchPageDelegate;

  // change done flag

}

しかし、Wintellect Power Threading を使用する方が快適です

于 2013-02-26T15:08:13.770 に答える