Исключение текстового поля с таймером - PullRequest
1 голос
/ 06 февраля 2011

У меня проблема с этим кодом.

Это генерирует это исключение:

Text 'выдало исключение типа' 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.

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

спасибо

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

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

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

Попробуйте

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

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

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

1 голос
/ 06 февраля 2011

Как прокомментировал Уве, вы не можете получить доступ или изменить компонент GUI, не входящий в поток 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);

  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...