Обновить ярлык из другого потока

Я использую запись потока в другом классе для обновления метки. Метка - это содержимое в основном классе Winform.

 Scanner scanner = new Scanner(ref lblCont);
 scanner.ListaFile = this.listFiles;
 Thread trd = new Thread(new ThreadStart(scanner.automaticScanner));
 trd.IsBackground = true;
 trd.Start();
 while (!trd.IsAlive) ;
 trd.Join();

Как вы можете видеть, я передаю ссылку метки в конструктор второго класса. Во втором классе (сканер) у меня есть метод под названием "automaticScanner", который должен обновить метку с помощью этого кода:

public Scanner(ref ToolStripStatusLabel _lblContatore)
{
        lblCounter= _lblContatore;
}
Thread threadUpdateCounter = new Thread(new ThreadStart(this.UpdateCounter));
threadUpdateCounter.IsBackground = true;
threadUpdateCounter.Start();
while (!threadUpdateCounter .IsAlive) ;
threadUpdateCounter.Join();

private void AggiornaContatore()
{
  this.lblCounter.Text = this.index.ToString();        
}

Я получаю эту ошибку при обновлении метки:

Неверная операция поперечного потока: элемент управления 'Main' доступен из потока, отличного от потока, который был создан на

Я использую .net 4 с Winform С#.

Большое спасибо за ответы.

Новости: Проблема заключается в этой строке:

trd.Join();

Эта строка блокирует мой графический интерфейс, а макет не обновляется. Существуют методы контроля финиша потока и обновления метки до конца? Благодаря

Ответ 1

Вы не можете обновлять интерфейс из любого другого потока, кроме потока пользовательского интерфейса. Используйте это, чтобы обновить поток в потоке пользовательского интерфейса.

 private void AggiornaContatore()
 {         
     if(this.lblCounter.InvokeRequired)
     {
         this.lblCounter.BeginInvoke((MethodInvoker) delegate() {this.lblCounter.Text = this.index.ToString(); ;});    
     }
     else
     {
         this.lblCounter.Text = this.index.ToString(); ;
     }
 }

Прочитайте эту главу и более из этой книги, чтобы получить четкое представление о потоковом:

http://www.albahari.com/threading/part2.aspx#_Rich_Client_Applications

Ответ 2

Используйте MethodInvoker для обновления текста меток в другом потоке.

private void AggiornaContatore()
{
    MethodInvoker inv = delegate 
    {
      this.lblCounter.Text = this.index.ToString(); 
    }

 this.Invoke(inv);
}

Вы получаете ошибку, потому что ваш поток пользовательского интерфейса удерживает метку, а поскольку вы пытаетесь обновить ее через другой поток, вы получаете исключение перекрестного потока.

Вы также можете увидеть: Threading в Windows Forms