Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the best way to update form controls from a worker thread?

I've done some research and I can't really find a preferred way to do updating of form controls from a worker thread in C#. I know about the BackgroundWorker component, but what is the best way to do it without using the BackgroundWorker component?

like image 420
Yttrium Avatar asked Oct 15 '08 23:10

Yttrium


3 Answers

There's a general rule of thumb that says don't update the UI from any thread other than the UI thread itself. Using the features of the BackgroundWorker is a good idea, but you don't want to and something is happening on a different thread, you should do an "Invoke" or BeginInvoke to force the delegate to execute the method on the UI thread.

Edit: Jon B made this good point in the comments:

Keep in mind that Invoke() is synchronous and BeginInvoke() is asynchronous. If you use Invoke(), you have to be careful not to cause a deadlock. I would recommend BeginInvoke() unless you really need the call to be synchronous.

Some simple example code:

// Updates the textbox text.
private void UpdateText(string text)
{
  // Set the textbox text.
  m_TextBox.Text = text;
}

public delegate void UpdateTextCallback(string text);

// Then from your thread you can call this...
m_TextBox.Invoke(new UpdateTextCallback(this.UpdateText),
    new object[]{"Text generated on non-UI thread."});

The code above is from a FAQ about it here and a longer more involved one here.

like image 87
AR. Avatar answered Sep 20 '22 01:09

AR.


Why dont you want to do it using the BackgroundWorker? It has a fantastic callback event called ProgressChanged which lets the UI thread know about updates, perfect for progess bar-type updates and the like.

link to details

like image 43
Mark Avatar answered Sep 20 '22 01:09

Mark


There's a discussion related to this here and one here.

Essentially, you use Invoke to accomplish it.

Best of luck!

like image 20
itsmatt Avatar answered Sep 19 '22 01:09

itsmatt