2017-02-21 19 views
0

這裏是我的代碼需要關於此錯誤的解釋「指定的轉換無效」。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     'BackgroundWorker1.RunWorkerAsync() 
     myFunction() 
    End Sub 

    Private Sub myFunction() 
     WebBrowser1.Navigate("http://google.com") 
     While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete 
      Application.DoEvents() 
     End While 
     TextBox1.Text = WebBrowser1.Document.Body.OuterText.ToString 
    End Sub 

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
     myFunction() 
    End Sub 

當我運行這一點,並單擊它工作正常Button1的,但是當我在我的按鈕1改成這樣:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     BackgroundWorker1.RunWorkerAsync() 
    End Sub 

我得到這個錯誤消息「指定的投是無效」

這裏我的目標很簡單
1.點擊一個按鈕,載入頁面
2.等待加載頁面補償letely
3.然後抓住頁面

+4

你不能直接從一個BackgroundWorker或其他螺紋類型中訪問窗體控件​​。爲什麼不只是使用WebBrowser1.DocumentCompleted事件? –

+0

我可以使用此Control.CheckForIllegalCrossThreadCalls = False代碼來訪問表單控件,但我的問題是爲什麼我不能這樣做。任何解釋? – user2932692

+5

BGW的要點是在後臺執行一些長時間運行的任務,使UI響應。 ReportProgress方法允許BGW在需要時將信息發送回UI。 'CheckForIllegalCrossThreadCalls = False'不是答案。這些都不需要 - 頁面加載時會觸發一個事件 – Plutonix

回答

1

像已經建議,你應該使用Web瀏覽器控件的DocumentCompleted event,以確定何時頁面完全加載的outerText。 Application.DoEvents() is bad,不應該用來保持你的UI響應!

我不知道你的代碼最初來自哪裏,也不知道爲什麼這麼多人使用它,但它是壞習慣!

正確的做法是使用DocumentCompleted事件:

Private Sub myFunction() 
    WebBrowser1.Navigate("http://google.com") 
End Sub 

Private Sub WebBrowser1_DocumentCompleted(sender As System.Object, e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted 
    If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then 
     TextBox1.Text = WebBrowser1.Document.Body.OuterText 'No need to call ToString() since 'OuterText' already is a string. 
    End If 
End Sub 

此外,跳過BackgroundWorker。無論如何您都無法從後臺線程訪問WebBrowser,而無需調用UI線程。


巧合的是,我回答a similar question僅僅幾個小時前...

相關問題