1

我有一个遍历多个值的循环。随着每个值的迭代,页面被加载到 webbrowser 控件中(将值作为参数传递),当页面被加载和读取时,循环应该转到列表中的下一个值并继续,直到处理完所有值。我需要一种方法来在网站异步加载时暂停该过程,然后在页面加载/阅读过程完成后恢复。

我正在做的方式是使用这样的东西,其中“ReadingInProgress”是一个全局变量:

      ReadingInProgress = True
      wb.Navigate("http://mywebsite.com/mypage.aspx" & c)

      While ReadingInProgress
        Application.DoEvents()
      End While

webbrowser 控件的“DocumentCompleted”事件将“ReadingInProgress”设置为 false,这会导致 while 循环退出并恢复该过程。这行得通,但我意识到它会给 CPU 带来压力。有没有更好、更少 CPU 密集型的方法来做到这一点?

谢谢!

4

2 回答 2

1

一种方法是获取循环之后的任何内容,并将其放入控件DocumentComplete事件的处理程序中。

另一种方法是让这段代码在另一个线程中运行。它会启动导航,然后等待信号量、或处理程序设置EventWaitHandle的其他可等待对象。DocumentComplete像这样的东西:

private sem as Semaphore
private withevents wb as WebBrowser

...

sub DoWork()
    for each url as String in urls
        ' You'll almost certainly need to do this, since this isn't the UI thread
        ' anymore.
        wb.invoke(sub() wb.Navigate(url))
        sem.WaitOne()

        ' wb is done

    next
end sub

sub wb_DocumentComplete(sender as obj, args as WebBrowserDocumentCompletedEventArgs) _
handles wb.DocumentCompleted
    sem.Release()
end sub

...

dim th as new Thread(addressof me.DoWork)
th.Start()

无论哪种方式,由于您不再占用 UI 线程,因此您不必担心Application.DoEvents().

于 2013-08-19T14:21:24.240 回答
1

我最近回答了一个类似的问题。解决方案是在 C# 中,但您可以Async/Await在 VB.NET中以非常相似的方式使用。使用这种技术,您将获得代码的自然执行流程(DocumentComplete事件被封装为Task)。

于 2013-08-19T15:25:58.170 回答