Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set value of label with C# Cross Threading

I need help with setting/changing the value of a label in my C# program whenever I try it an error occurs saying I need to cross thread it all. Can anyone write some code to help me with that? My code is:

int number = 0;
int repeats = Convert.ToInt32(textBox2.Text);

while (number < repeats)
{
   repeats++;
   label5.Text = "Requested" + repeats + "Times";
}

Can anyone help me? Thanks.

like image 793
Lawrence Avatar asked Jan 31 '10 16:01

Lawrence


2 Answers

Try the following to update the value

label5.Invoke((MethodInvoker)(() => label5.Text = "Requested" + repeats + "Times"));

The Invoke method (from Control.Invoke) will cause the passed in delegate to be run on the thread which the given Control is affinitized to. In this case it will cause it to run on the GUI thread of your application and hence make the update safe.

like image 86
JaredPar Avatar answered Oct 10 '22 17:10

JaredPar


You can add this extension method that I regularly use (similar in technique to @JaredPar's answer):

  /// <summary>
  /// Extension method that allows for automatic anonymous method invocation.
  /// </summary>
  public static void Invoke(this Control c, MethodInvoker mi)
  {
     c.Invoke(mi);

     return;
  }

You can then use on any Control (or derivatives) natively in your code via:

// "this" is any control (commonly the form itself in my apps)  
this.Invoke(() => label.Text = "Some Text");

You can also execute multiple methods via anonymous method passing:

this.Invoke
(
   () =>
   {
      // all processed in a single call to the UI thread
      label.Text = "Some Text";
      progressBar.Value = 5;
   }
);

Bear in mind that if your threads are trying to Invoke on a control that is disposed, you'll get an ObjectExposedException. This happens if a thread hasn't yet aborted by the application is shutting down. You can either "eat" the ObjectDisposedException by surrounding your Invoke() call, or you can "eat" the exception in the Invoke() method extension.

like image 32
Michael Avatar answered Oct 10 '22 18:10

Michael