2011-02-06 3 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이다.

어떻게 할 수 있습니까? 당신은 Windows에서 GUI 구성 요소에 액세스 할 수 있습니다

감사

+1

LoggerTxt 무엇을 사용할 수 있습니까? – Jon

+0

아마도 컨트롤의 Text 속성에 대한 Watch식이 원인 일 수 있습니다. 나는 지난 몇 주 동안이 * 디버거 * 예외 팝업을 보았습니다. 뭔가 잘못되었습니다. VS2010 용 베타 서비스 팩이 설치되어 있습니까? –

답변

2

는 전경 스레드 내에서 응용 프로그램을 형성한다. (내 생각에 이것은 WPF 응용 프로그램에서도 마찬가지입니다)

(백그라운드 스레드의) 타이머 기능에서 TextBox (GUI 구성 요소)의 함수를 호출하려고하므로 예외가 발생합니다.

예외를 방지하기 위해

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

을보십시오.

자세한 내용은 Control.Invokethis similar SO posting의 설명서를 참조하십시오.

+1

WPF에는 같은 방법으로 사용할 수있는'dispatcher' 객체가 있습니다. – Thomson

1

Uwe가 주석을 달았으므로 GUI 스레드가 아닌 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); 

    } 

}