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 is loaded and read, the loop should go to the next value in the list and continue until all values are processed. I need a way to pause the procedure while the website is loading asynchronously and then resume once the page loading/reading process is complete.
The way I am doing is by using something like this, where "ReadingInProgress" is a global variable:
ReadingInProgress = True
wb.Navigate("http://mywebsite.com/mypage.aspx" & c)
While ReadingInProgress
Application.DoEvents()
End While
The "DocumentCompleted" event of the webrowser control set "ReadingInProgress" to false which causes the while loop to exit and resume the procedure. This works, but I realize that it puts a strain on the CPU. Is there a better, less CPU intensive way to do this?
Thanks!
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 theDocumentComplete
handler sets. Something like this:Either way, since you're not taking up the UI thread anymore, you don't have to worry about
Application.DoEvents()
.I've recently answered a similar question. The solution is in C#, but you can use
Async/Await
in VB.NET in a very similar way. Using this technique, you would get a natural flow of execution for your code (DocumentComplete
event is encapsulated asTask
).