Как я могу обработать "CrossThreadMessagingException"? - PullRequest
1 голос
/ 20 октября 2011

У меня есть простой код для отображения временной последовательности в моем графическом интерфейсе с помощью компонента метки. Этот код находится в событии таймера таймера. Иногда я получаю «Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException» и не знаю почему? Как я могу поймать это исключение? Как я могу изменить свой код, чтобы не получить это исключение?

    //Calculate and show elapsed time
    TimeSpan ElapsedTime = DateTime.Now - this.StartTime;
    this.LabelElapsedTime.Text = String.Format("{0:00}:{1:00}:{2:00}", ElapsedTime.Hours, ElapsedTime.Minutes, ElapsedTime.Seconds);

1 Ответ

6 голосов
/ 20 октября 2011

Скорее всего, событие таймера обращается к элементу управления из другого потока, например, из события Timer.Interval. Чтобы избежать этой проблемы, необходимо проверить свойство Control.InvokeRequired, и, если оно истинно, доступ к элементу управления должен быть выполнен с использованием делегата из метода Control.Invoke.

Примером этого может быть следующий:

void UpdateLabel(Label lbl, String text)
{
    if (lbl.InvokeRequired)
    { lbl.Invoke(new Action<Label, String>(UpdateLabel), new object[] { lbl, text }); }
    else
    { lbl.Text = text; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...