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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…