WinForms Multithreading – How to Update UI from a Different Thread

asynchronousmultithreadingwinforms

I know this question has been asked before, but I feel it wasn't asked correctly.

I have an intensive operation and I'd like the UI to remain responsive. I've read a few posts that say Background worker is the best way to go, however, I think this assumes you have the source code to the intensive task.

I have a library that I have no source code for, the only way I can check on the progress is to attach to events that get fired and get information that way.

The example I saw on the MSDN site assumed one would have the source.

I know how to get progress (which is a percentage value) by attaching to events, but how do I get that value back to the UI?

Best Answer

The following answer is based on my gut feeling and have not actually done it a test with third party libs.

  • Call your third party lib code as usual you call in a simple background (not BackGroundWorker) thread.
  • Attach the library components' events to normal event handlers in your code (meant to update UI).
  • In the event handler code should look like this:

    private void EventHandler(object sender, DirtyEventArgs e)
    {
        if (myControl.InvokeRequired)
            myControl.Invoke(new MethodInvoker(MethodToUpdateUI), e);
        else
            MethodToUpdateUI(e);
    }
    
    private void MethodToUpdateUI(object obj) 
    {
        // Update UI
    }
    
Related Question