2016-08-18 3 views
0

のために使用した場合のナビゲートに貼り付けURLを変更するforループC#のWebBrowserコントロールは、私が持っているループ

  for (int i = 1; i < max; i += 50) 
      { 
       completed = false; 
       string currkey = country; 
       crawler.Navigate(new Uri("http://www.example.net/func.php?dom=" + currkey + "&key=&start=" + i)); 
       Console.WriteLine("Navigating to " + "http://www.example.net/func.php?dom=" + currkey + "&key=&start=" + i); 
       while (!completed) 
       { 
        Application.DoEvents(); 
        Thread.Sleep(500); 
       } 
      } 

これは私のdocumentcompletedハンドラ

私はforループを取り除く
 crawler.Refresh(); 
     Console.WriteLine("Getting universities"); 
     getUniversities(); 
     Console.WriteLine("Finished getting universities"); 
     completed = true; 

と1つのリンクを使用すると、ウェブサイトを正しくナビゲートするように見えますが、forループを使用してウェブサイトを順番にロードすると、ウェブブラウザが2回目の繰り返しで停止するようです。

例:最初の繰り返しで currkey =米国

、Webサイトのリンクはhttp://www.example.net/func.php?dom=「米国」&キーになります= = 1開始&、そして次のいずれかにそれがhttp://www.example.net/func.php?dom=「米国になります"& key = & start = 51。 2番目のリンクを読み込もうとすると、ナビゲーションが停止します。

私は現在の反復が終了したがまだ止まっていることに注意してください。

ヘルプの任意の種類は

+0

ドキュメントにブレークポイントを入力してください。それは最初の反復以上の反復でヒットしますか? – mariocatch

+0

はい、何らかの理由で何らかの理由でロードが完了しないので、while(!complete)の行が継続しています –

答えて

0

あなたThread.Sleep呼び出しはロードし続けてからWebBrowserをブロックしている認識されます。あなたがしなければならないことは、DocumentCompletedイベントに付いて、次のページをロードすることです。 WinFormsでこのwhile/sleepの組み合わせを使用しないでください。コントロールが公開するイベントを使用する必要があります。

がイベントをアタッチ:

crawler.DownloadCompleted += CrawlerDocumentCompleted; 

イベントハンドラ:

private void CrawlerDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    //The document has loaded - now do something 
} 

最終的な思考

あなたはなぜあなたはWebBrowserを使用している、クローラを実装しているように見えたようナビゲートするWinFormsのコントロール確かにあなたが興味を持っているのは、サーバーが提供するHTMLです。またはJavaScriptを使用してDOMに追加要素を読み込むページで、WebBrowserを使用する必要がありますか?

WebClientクラスとDownloadStringまたはDownloadStringAsyncメソッドを使用できます。 https://msdn.microsoft.com/en-us/library/fhd1f0sw(v=vs.110).aspx

+0

私は十分にはっきりしませんでした。このプログラムはwinformではないコンソールプログラムです。私はこの行を行いました - > crawler.DocumentCompleted + = wb_DocumentCompleted;私のメイン。 –

+0

それでは、HTMLをダウンロードしてクロールしたいと思うように聞こえます(ページにJSがないと仮定します).WebClientクラスを使用する必要があります。 –

+0

WebClientクラスの問題は、現在WebClientを使用している場合、そのWebブラウザのHTMLからdocument.getelementbyidを使用しています。必要な要素を取り出すために文字列からhtmlを作成する必要があります。私が間違っていれば私を訂正してください。また、あなたの答えに感謝します。 –

関連する問題