Multi-threading and cross-thread function invoke

If you have ever worked on a multithreaded application, you probably know that accessing controls of UI thread (like textbox, labels etcc…) directly from another thread is not possible.Acessing UI controls directly from a thread other than UI thread would give you a run-time error.

Here is the simple solution to access the UI controls from a background thread .

1. Write a function that access the UI controls (here we are displaying error info of the background thread)

Private Sub DisplayError(ByVal errMsg As String)
 {
  lblMsg.Text = errMsg
 }

2. Write another function that decides if it is being called from the UI thread or from another thread-
If its called from its own thread, call the DisplayError() function directly or else invoke it through a delegate

private Sub DisplayErrorOnUI(ByVal errMsg As String)
 {
                If (Me.InvokeRequired) Then
                    Dim invokeDelegate As _invokeUIControlDelegate = New _invokeUIControlDelegate(AddressOf DisplayError)
                    Me.Invoke(_invokeUIControlDelegate, errMsg)
                Else
                    DisplayError(errMsg)  
 }

3. Declare a delegate in the class (or form in this case) to the above function (i.e DisplayErrorOnUI())

Private Delegate Sub _invokeUIControlDelegate(ByVal errMsg As String)

4. In the background thread call the InvokeUIControl() function as required

Try
 // do something here that gives error
Catch ex As Exception
 DisplayErrorOnUI(ex.Message)
End Try
150 150 Burnignorance | Where Minds Meet And Sparks Fly!