2011-02-06 18 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 2011-02-06 14:38:16

+0

它可能是由控件的Text屬性上的Watch表達式引起的。過去幾周裏我看到這個*調試器*異常出現,這是錯誤的。您是否安裝了VS2010的測試版服務包? – 2011-02-06 15:41:17

回答

2

您可以在Windows訪問GUI組件只能從前臺線程內窗體應用程序。 (我認爲WPF應用程序也是如此)

由於您試圖從定時器函數(在後臺線程中)調用TextBox(GUI組件)的函數,您將得到異常。

嘗試

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

爲避免該異常。

有關該主題的更多信息,請參閱Control.Invoke的文檔以及this similar SO posting

1

由於Uwe評論說您不能在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); 

    } 

}