Подскажите, пожулайста, вариант решения следующей проблемы.
Есть класс, в котором срабатывает событие, необходимо на форме обновить GUI, например так:
private void MainForm_Load(object sender, EventArgs e)
{
MyClass class = new MyClass();
class.MyEvent += new MyEventHandler(class_MyEvent);
...
}
void class_MyEvent()
{
label1.Text = "text";
}
во время срабатывания события происходит эксепшн, что я пытаюсь изменить label1 из другого потока.
Вижу только такое решение, с использованием таймера:
Здравствуйте, LoparevSV, Вы писали:
LSV>Подскажите, пожулайста, вариант решения следующей проблемы.
LSV>Есть класс, в котором срабатывает событие, необходимо на форме обновить GUI, например так:
LSV>во время срабатывания события происходит эксепшн, что я пытаюсь изменить label1 из другого потока. LSV>Вижу только такое решение, с использованием таймера: LSV>Подскажите более правильное и красивое решение
Смотрите такие вещи, как InvokeRequired property, методы Invoke, BeginInvoke, EndInvoke.
_D>Смотрите такие вещи, как InvokeRequired property, методы Invoke, BeginInvoke, EndInvoke.
ну как я понимаю, этот вариант возможен, если мне нужно изменить свойство в каком-то одном контроле (как в моем примере label.text), а если всю форму с кучей контролов изменить надо? или я что-то недопонимаю...
Re: потокобезопасность в GUI
От:
Аноним
Дата:
28.07.08 07:20
Оценка:
Для работы с GUI из другого потока можно использовать BackgroundWorker, его событие DoWork выполняеться в нужном потоке.
_D>>Смотрите такие вещи, как InvokeRequired property, методы Invoke, BeginInvoke, EndInvoke.
LSV>ну как я понимаю, этот вариант возможен, если мне нужно изменить свойство в каком-то одном контроле (как в моем примере label.text), а если всю форму с кучей контролов изменить надо? или я что-то недопонимаю...
Вы имели в виду что-то вроде такого?
delegate void RefreshDataHandler();
private void MainForm_Load(object sender, EventArgs e)
{
MyClass class = new MyClass();
class.MyEvent += new MyEventHandler(class_MyEvent);
_D>да, Вы же в первом посте что-то подобное хотели сделать. _D>это по каким-то причинам Вам не подходит ?
Нет, в первом посте я через таймер делал. Меня интересует наиболее правильный вариант, каким образом изменять контролы в GUI, когда происходит событие из стороннего класса