A better way to wait for a variable to change state in VB.Net

后端 未结 2 382
悲哀的现实
悲哀的现实 2021-01-23 19:27

I have a loop that goes through a number of values. With every value iterated, a page is loaded in a webbrowser control (with the value passed as a parameter) and when the page

2条回答
  •  礼貌的吻别
    2021-01-23 19:46

    One way would be to take whatever is after the loop, and put that in the handler for the control's DocumentComplete event.

    Another would be to have this code run in another thread. It'd start the navigation and then wait on a semaphore, EventWaitHandle, or other waitable object that the DocumentComplete handler sets. Something like this:

    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()
    

    Either way, since you're not taking up the UI thread anymore, you don't have to worry about Application.DoEvents().

提交回复
热议问题