2012-09-10 133 views
1

我想在文檔完全加載後執行某些操作...我不想使用WebBrowser.DocumentCompleted事件,因此請不要將此建議給我。C#在文檔加載後執行某些操作

我試過2種方法,但他們不工作。有人能告訴我我做錯了什麼嗎?

實施例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 Event」 - 爲什麼不? – 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()這個「專項行動」網頁加載完成之前,否則就可能特殊情況的事件。一種方法可能是阻止用戶界面,直到頁面加載完成,例如:

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 } 
相關問題