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

前端 未结 4 1510
醉酒成梦
醉酒成梦 2020-12-18 04:47

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, b

4条回答
  •  天命终不由人
    2020-12-18 05:10

    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.

提交回复
热议问题