Обновление GUI из другого потока

Рейтинг: 2Ответов: 5Опубликовано: 27.04.2011

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

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

Ответы

▲ 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";
}
▲ 9
myTextBox.Invoke(new Action(() => { myTextBox.Text = "Обновляем данные"; }));
▲ 3

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

private void button1_Click(object sender, EventArgs e) {
    var sync = SynchronizationContext.Current;
    new Thread(_ => {
        sync.Post(__ =>
            label.Text = "Clicked!", null);
    }).Start();
}
▲ 3

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

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

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