2

Подскажите простой способ, как можно обновить label из другого потока?

Ситуация следующая: имеется окно (поток1), в котором стартует новый поток (поток2). Когда поток2 обрабатывает файлы, необходимо обновить label на форме, используя информацию из потока2.

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
Jones
  • 274
  • 2
  • 14
  • 30

5 Answers5

9
myTextBox.Invoke(new Action(() => { myTextBox.Text = "Обновляем данные"; }));
Merlin
  • 5,491
  • 5
  • 47
  • 90
5

Используйте BeginInvoke. Вот пример из документации

public delegate void InvokeDelegate();

private void Invoke_Click(object sender, EventArgs e) { myTextBox.BeginInvoke(new InvokeDelegate(InvokeMethod)); } public void InvokeMethod() { myTextBox.Text = "Executed the given delegate"; }

yapycoder
  • 1,905
  • 13
  • 16
3

Так пишут по-пацански (если без async, конечно):

private void button1_Click(object sender, EventArgs e) {
    var sync = SynchronizationContext.Current;
    new Thread(_ => {
        sync.Post(__ =>
            label.Text = "Clicked!", null);
    }).Start();
}
Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
Skiff
  • 255
  • 2
  • 8
3

Можно еще так:

var settextAction = new Action(() => { myTextBox.Text = "Обновляем данные"; });
if (myTextBox.InvokeRequired)
   myTextBox.Invoke(settextAction); 
else
   settextAction();
ganouver
  • 2,762
2

На формочках рекомендуется обычно использовать BackgroundWorker.

Modus
  • 8,885
  • 26
  • 66