2017-02-21 17 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 он работает нормально, но когда я изменить button1 к этому:

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. затем захватить outerText страницы

+4

Вы не можете получить прямой доступ управления формы изнутри BackgroundWorker или другого типа резьбы. Почему вы не просто используете событие WebBrowser1.DocumentCompleted? –

+0

Я могу использовать этот Control.CheckForIllegalCrossThreadCalls = False код для доступа к элементу управления формой, но мой вопрос - почему я не могу этого сделать. любое объяснение? – user2932692

+5

Точка BGW состоит в том, чтобы выполнить некоторую длительную задачу на заднем плане, оставляя пользовательский интерфейс отзывчивым. Метод ReportProgress позволяет BGW отправлять информацию обратно в пользовательский интерфейс, когда это необходимо. 'CheckForIllegalCrossThreadCalls = False' не является ответом. Ничего из этого не требуется - событие запускается при загрузке страницы. – Plutonix

ответ

1

Как уже отмечалось, вы должны использовать элемент управления веб-браузера DocumentCompleted event, чтобы определить, когда страница полностью загружена. Application.DoEvents() is bad, и не следует использовать, чтобы ваш пользовательский интерфейс был отзывчивым!

Я понятия не имею, откуда изначально исходит ваш код, и почему его так много используют, но это ПЛОХАЯ ПРАКТИКА!

Правильный подход заключается в использовании 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 из фонового потока, не обращаясь ни к нити пользовательского интерфейса.


совпадению, я ответил a similar question всего несколько часов назад ...