2014-11-13 4 views
1

각 HTML을 개별적으로 추출해야하는 URL 목록이 있습니다. URL은 :C# webBrowser in a loop

foo_list = {"expamle.com", "example.net", "example.org"}; 

코드는 내가 노력 :

foreach (string x in foo_list) { 
     webBrowser1.Navigate(x); 
} 

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    string html = webBrowser.Document.Body.Parent.OuterHtml; 
    // handle the html and save to file... 
} 

문제는 난 그냥 HTML과 목록의 마지막 URL (example.org)의 데이터를 가지고있다. foreach 루프의 Navigate 명령이 너무 빨리 실행되므로 마지막 URL이 DocumentCompleted을 기다릴 수 있음을 이해합니다. 그렇다면이 문제를 어떻게 처리 할 수 ​​있습니까?

+3

'async'와'await'을 사용하십시오. – Shaharyar

+0

'Chelsea_cole'은 웹 기능/브라우징 및/또는 리디렉션이'Stateless'이고'Windows'와 같지 않습니다. 여유 시간에 비동기 작업을 기다리고 기다릴 것입니다. function – MethodMan

+0

어, 왜 HTTP 클라이언트를 사용하지 않으시겠습니까? REST 샤프를보세요 – Crisfole

답변

2

당신은 인덱스를 유지하여 처리 할 문서의 다운로드 진행이 완료 될 때까지 기다린 후 다음 단계로 이동할 수 있습니다 : 당신이로 이동해야합니다

int index = -1; //variable in class 
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    string html = webBrowser.Document.Body.Parent.OuterHtml; 
    if (index + 1 != foo_list) //So it will stop when there's no links left. 
     webBrowser1.Navigate(foo_list[++index]); 
} 

그러나 URL의 회전을 트리거 목록의 첫 번째 URL

if (index + 1 != foo_list.Count) 
    webBrowser1.Navigate(foo_list[++index]); 

을하지만 그 대신 나는 다른 제안 할 :이 작업을 수행하려면 당신은 그것을 실행하는 데 다른 사람이 곳을 실행할 수 있습니다 당신은 당신의 방법을 선택하고 다운로드하는 동안 반복 할 수 있습니다 WebClient.DownloadString(System.String), 직접 HTML을 다운로드 할 수 있습니다 .

+0

Thx mate! 알 겠어! –