Установите значение метки с помощью С# Cross Threading

Мне нужна помощь в настройке/изменении значения метки в моей программе на С# всякий раз, когда я пытаюсь сделать ошибку, говоря, что мне нужно пересечь все это. Может ли кто-нибудь написать код, чтобы помочь мне в этом? Мой код:

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

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

Может ли кто-нибудь мне помочь? Спасибо.

Ответ 1

Попробуйте следующее обновить значение

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

Метод Invoke (из Control.Invoke) приведет к тому, что переданный в делететете будет запущен в потоке, к которому привязан данный Control. В этом случае он будет запускаться в потоке графического интерфейса вашего приложения и, следовательно, сделает обновление безопасным.

Ответ 2

Вы можете добавить этот метод расширения, который я регулярно использую (аналогично в технике для ответа @JaredPar):

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

     return;
  }

Затем вы можете использовать любой элемент управления (или производные) в своем коде через:

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

Вы также можете выполнять несколько методов с помощью анонимного метода передачи:

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

Имейте в виду, что если ваши потоки пытаются вызывать на управляемом элементе управления, вы получите исключение ObjectExposedException. Это происходит, если поток, который еще не отменен приложением, отключается. Вы можете "съесть" ObjectDisposedException, окружая ваш вызов Invoke(), или вы можете "съесть" исключение в расширении метода Invoke().