2012-09-10 3 views
1

문서가 완전히로드 된 후 무언가를하고 싶습니다 ... WebBrowser.DocumentCompleted 이벤트를 사용하고 싶지 않습니다. 따라서 제게 제안하지 마십시오.C# 문서가로드 된 후 무언가 수행

두 가지 방법으로 시도했지만 작동하지 않습니다. 누군가 내가 뭘 잘못했는지 말해 줄 수 있니?

예 1

wb.Navigate("http://www.google.com"); 
while(wb.ReadyState != WebBrowserReadyState.Complete) { } 
richtextdocument.Text = wb.DocumentText; 

예 문서 부하 상태를 검증하기 위해 타이머를 사용할 수있는 2

wb.Navigate("http://www.google.com"); 
while(wb.isBusy == true) { } 
richtextdocument.Text = wb.DocumentText; 
+4

'DocumentCompleted'이벤트 뭐가 잘못? – mbm

+2

'DocumentCompleted'를 사용하지 않으려는 이유를 말씀해 주시겠습니까? 로드가 완료되었는지 확인하는 것이 최선의 방법이 아닌 것 같습니다. 두 개의 샘플을 제공하면 많은 CPU 사용이 발생합니다 (스레드가 절전 상태가 아니므로 가능한 초당 많은 시간을 확인합니다). – MaciekTalaska

+1

"WebBrowser.DocumentCompleted 이벤트를 사용하고 싶지 않습니다."- 왜 안 되니? – Larry

답변

0

여기에서 다루는 것은 본질적으로 비동기 메서드를 동 기적으로 호출하는 것입니다.

DocumentCompleted을 사용하지 않는 이유는 다른 목적으로 해당 이벤트를 사용해야한다는 것입니다. 내 의견에는 DocumentCompleted 이벤트를 사용하고 개인 클래스와 함께 사용하는 것이 좋습니다. 부울 플래그가 DocumentCompleted의 특수한 경우인지 여부를 결정합니다.

private bool wbNeedsSpecialAction; //when you need to call the special case of Navigate() set this flag to true 

public Form1() 
{ 
    InitializeComponent();   
    wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted); 
} 

void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    if (wbNeedsSpecialAction) 
    { 
     richtextdocument.Text = wb.DocumentText; 
     wbNeedsSpecialAction = false; 
    } 
    else 
    { 
     //other cases of using DocumentCompleted... 
    } 
} 

public void Browse() 
{ 
    wbNeedsSpecialAction = true; //make sure the event is treated differently 
    wb.Navigate("http://www.google.com"); 
} 

이렇게하면 이벤트 처리기 내에서 다른 사례를 제어 할 수 있습니다.

당신은 그렇지 않으면 특별한 경우 이벤트 훔칠 수 있으며, 사용자는이 '특별 행동'페이지로드가 완료 이전 Navigate()에 다른 전화를 트리거 할 수 없다는 것을 보장하기 위해 특별한주의를 기울여야한다. 페이지가 로딩이 완료 될 때까지 한 가지 방법은 UI를 차단할 수, 예컨대 :

Cursor.Current = Cursors.WaitCursor; 
1

보십시오.

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      if(webBrowser1.ReadyState == WebBrowserReadyState.Complete) 
      { 
       timer1.Enabled = false; 
       richTextBox1.Text = webBrowser1.DocumentText; 
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      timer1.Enabled = true; 
      webBrowser1.Navigate("http://www.google.com"); 
     } 
    } 
0
while(wb.ReadyState != WebBrowserReadyState.Complete) {application.doevents } 
관련 문제