2011-02-06 2 views
1

У меня проблема с этим кодом.Исключение текстового поля с таймером

Это создает это исключение:

Текст 'сгенерировала исключение типа ' Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException

private void Form1_Load(object sender, EventArgs e) 
{ 
    Timer = new System.Threading.Timer(
     TimerTick, null, TimeSpan.Zero, new TimeSpan(0, refresh , 0)); 
} 

void TimerTick(object state) 
{ 
    LoggerTxt.AppendText("fsjdaò"); 

} 

LoggerTxt является TextBox.

Как я могу это сделать?

благодарит

+1

Что такое LoggerTxt? – Jon

+0

Вероятно, это вызвано выражением Watch в свойстве Text элемента управления. Я видел, как это исключение * отладчика * появилось за последние несколько недель, что-то не так. У вас установлен бета-пакет обновления для VS2010? –

ответ

2

Вы можете получить доступ к GUI компоненты в Windows Forms приложения только из переднего плана нить. (Я думаю, это относится и к приложениям WPF)

Поскольку вы пытаетесь вызвать функцию из TextBox (компонент GUI) из функции таймера (в фоновом потоке), вы получаете исключение.

Попробуйте

LoggerTxt.Invoke( 
    new MethodInvoker( 
     delegate { LoggerTxt.AppendText("fsjdaò"); })); 

Чтобы избежать исключения.

Также см. Документацию Control.Invoke для получения дополнительной информации по этой теме и this similar SO posting.

+1

В WPF есть объект 'dispatcher', который можно использовать таким же образом. – Thomson

1

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

Если вы собираетесь сделать это, почему бы не добавить этот класс в свои проекты, чтобы все объекты управления подвергались этому методу.

Вы можете использовать LoggerTxt.RunInGUIThread(x => x.AppendText("fsjdao"));

public static class ControlExtensions 

{ 

    public static void RunInGUIThread<TControl>(this TControl control, Action<TControl> action) 

    where TControl: Control 

    { 

    if (control.InvokeRequired) 

     control.Invoke(action, control); 

    else 

     action(control); 

    } 

}