I want to set the TextBlock text to my StatusBar before the user will wait for a short moment while my program runs a little.
Apparently, instead of making such a small function like this (which doesn't work):
Function Load(ByVal Id As Guid) As Thing Cursor = Cursors.Wait TextBlockStatus.Text = "Loading..." TextBlockStatus.UpdateLayout() Dim Found = From t In db.Thing _ Where t.Id = Id _ Select t TextBlockStatus.Text = String.Empty Cursor = Cursors.Arrow Return Found End Function
I have to use this monster:
Private WithEvents LoadWorker As BackgroundWorker Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded InitializeLoadWorker() End Sub Private Sub InitializeLoadWorker() LoadWorker = New BackgroundWorker LoadWorker.WorkerSupportsCancellation = False LoadWorker.WorkerReportsProgress = False AddHandler LoadWorker.DoWork, AddressOf LoadBackgroundWorker_DoWork AddHandler LoadWorker.RunWorkerCompleted, AddressOf LoadBackgroundWorker_RunWorkerCompleted End Sub Sub Load(ByVal Id As Guid) Cursor = Cursors.Wait LoadWorker.RunWorkerAsync(Argument) End Sub Private Sub LoadBackgroundWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Dim Worker As BackgroundWorker = DirectCast(sender, BackgroundWorker) Dim Id As Guid = DirectCast(e.Argument, Guid) e.Result = From t In db.Thing _ Where t.Id = Id _ Select t End Sub Private Sub LoadBackgroundWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) TextBlockStatus.Text = String.Empty Cursor = Cursors.Arrow Dim Found As Thing = DirectCast(e.Result, Thing) 'now do something with the found thing here instead of where Load() is called.' End Sub
And the Load () function is now Sub !!
There must be a better way to deal with such a simple situation. This does not have to be asynchronous.
source share