2011-02-06 20 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

おそらく、コントロールのTextプロパティのWatch式が原因です。私はこの*デバッガ*例外が過去数週間にわたってポップアップしているのを見てきましたが、何か間違っています。 VS2010のベータ版サービスパックはインストールされていますか? –

答えて

2

あなたは、WindowsのGUIコンポーネントにアクセスできる唯一のフォアグラウンドスレッド内からフォームアプリケーション。

TextBox(GUIコンポーネント)の関数を(バックグラウンドスレッドの)タイマ関数から呼び出そうとしているので、例外が発生します。

例外を回避するには

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

を試してみてください。

また、this similar SO postingの詳細についてはControl.Invokeのドキュメントを参照してください。

+1

同じ方法で使用できる 'dispatcher'オブジェクトがWPFにあります。 – Thomson

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); 

    } 

} 
関連する問題