-1

私はしばらくの間ネットを掘り下げていましたが、問題を解決するのに役立つコード例が見つかりません..サンプルコードを見てきましたが、まだ「理解」していません...

読み進めましたが、

http://msdn.microsoft.com/en-us/library/aa480507.aspxおよび
http://msdn.microsoft.com/en-us/library/dd781401.aspx

しかし、私はそれを機能させることができないようです..

HTMLAGILITYPACKを使用しています

今日、私は最大 20 個の Web リクエストを行います。

リクエストが終了すると、結果がディクショナリに追加されます。その後、メソッドが情報を検索し、コードが見つかった場合は終了し、そうでない場合は別の webrequest を作成し、20 で上限に達します。すべてのスレッドを非同期で終了できるようにする必要があります。すべてが見つかったときに呼び出します。

こんなふうになります

public void FetchAndParseAllPages()
    {
        PageFetcher fetcher = new PageFetcher();
        for (int i = 0; i < _maxSearchDepth; i += _searchIncrement)
        {
            string keywordNsearch = _keyword + i;
            ParseHtmldocuments(fetcher.GetWebpage(keywordNsearch));
            //this checks if the information was found or not, if 
            //found stop exit and add to database

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

これは、ページをフェッチするクラス内にあります

    public HtmlDocument GetWebpage(string urlToParse)
    {

        System.Net.ServicePointManager.Expect100Continue = false;
        HtmlWeb htmlweb = new HtmlWeb();
        htmlweb.PreRequest = new   HtmlAgilityPack.HtmlWeb.PreRequestHandler(OnPreRequest);
        HtmlDocument htmldoc = htmlweb.Load(@"urlToParse", "38.69.197.71", 45623, "PORXYUSER", "PROXYPASSWORD");

        return htmldoc;       
    }

    public bool OnPreRequest(HttpWebRequest request)
    {
       // request.UserAgent = RandomUseragent();
        request.KeepAlive = false;
        request.Timeout = 100000;
        request.ReadWriteTimeout = 1000000; 
        request.ProtocolVersion = HttpVersion.Version10;
        return true; // ok, go on
    }

これを非同期にして、スレッドで本当に速くするにはどうすればよいですか? または、非同期で実行するときにスレッドを使用する必要がありますか?

4

1 に答える 1

0

よし解決した!少なくとも私はそう思う!実行時間は約 7 秒に短縮されました。非同期なしでそれを行うのに約30秒かかりました。

ここで、将来の参照用に私のコードを示します。編集コンソールプロジェクトを使用してコードをテストしました。また、html agilitypack を使用しています。これは私のやり方です。これをさらに最適化する方法についてのヒントは、見るのがクールです。

    public delegate HtmlDocument FetchPageDelegate(string url);

    static void Main(string[] args)
    {
        System.Net.ServicePointManager.DefaultConnectionLimit = 10;
        FetchPageDelegate del = new FetchPageDelegate(FetchPage);
        List<HtmlDocument> htmllist = new List<HtmlDocument>();
        List<IAsyncResult> results = new List<IAsyncResult>();
        List<WaitHandle> waitHandles = new List<WaitHandle>();

        DateTime start = DateTime.Now;
        for(int i = 0; i < 200; i += 10)
        {
            string url = @"URLSTOPARSE YOU CHANGE IT HERE READ FROM LIST OR ANYTHING";
            IAsyncResult result = del.BeginInvoke(url, null, null);
            results.Add(result);
            waitHandles.Add(result.AsyncWaitHandle);
        }

        WaitHandle.WaitAll(waitHandles.ToArray());

        foreach (IAsyncResult async in results)
        {   
            FetchPageDelegate delle = (async as AsyncResult).AsyncDelegate as FetchPageDelegate;
            htmllist.Add(delle.EndInvoke(async));
        }
        Console.ReadLine();

    }

    static HtmlDocument FetchPage(string url)
    {
        HtmlWeb htmlweb = new HtmlWeb();
        HtmlDocument htmldoc = htmlweb.Load(url);
        return htmldoc; 
    }
于 2012-11-05T13:25:33.237 に答える