I’m looking for a generic method to implement a wait screen during long operations. I have used threading a few times before, but I have the feeling that I implemented it either very poorly, or with way too much hassle (and copy/pasting – the horror!).
I want to keep this as generic and simple as possible, so I won’t have to implement loads of BackgroundWorkers handling all kinds of crap, making things hard to maintain.
Here’s what I would like to do — please note this might differ from what’s actually possible/best practise/whatever — using VB.NET, Framework 2.0 (so no anonymous methods):
Private Sub HandleBtnClick(sender as Object, e as EventArgs) Handles Button.Click LoadingScreen.Show() 'Do stuff here, this takes a while!' Dim Result as Object = DoSomethingTakingALongTime(SomeControl.SelectedObject) LoadingScreen.Hide() ProcessResults(Result) End Sub
The application is now completely single-threaded, so everything runs on the GUI thread. I need to be able to access objects in DoSomethingTakingALongTime() without getting cross-thread exceptions. The GUI thread waits for some method (which takes a long time) to complete, while the LoadingScreen Form should stay responsive (it’s animated/has a progressbar/etc.).
Is this a doable/good approach or am I seeing this way too simplistic? What is the best practise concerning this matter? And most importantly: how could I implement such a system? As I already mentioned, I have very little experience with threading, so be gentle please 🙂
Your problem is that your getting a cross thread exception when your trying to pass your Worker thread data to your ui thread. what you need to do is check InvokeRequired and begininvoke before setting the controls on your ui so you don’t get the error like so:
just change the
New EventHandlerpart to the event handler your using.Also i think using a background worker isn’t a bad method for your worker classes, just create a class for your work and use the background worker to do the threading stuff a bit like this:
disclaimer.. bit rusty with vb but you should get the idea.