2010-04-26 6 views
4

응용 프로그램을 만들고 있는데 해당 응용 프로그램에서 타이머를 사용하여 WPF C# .NET의 레이블 내용을 변경하고 있습니다. Throwing 타이머가있는 레이블 내용을 변경하는 방법 InvalidOperationException

는 타이머의 경과 이벤트에 다음 코드

lblTimer.Content = "hello"; 

을 쓰고 있어요하지만 다른 스레드가 그것을 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수없는 InvalidOperationException을 던지고 메시지 을 제공합니다.

.NET Framework 3.5 및 WPF with C#을 사용하고 있습니다.

도와주세요.
미리 감사드립니다.

+0

어떤 타이머를 사용하고 있습니까? 특히, 타이머의 네임 스페이스는 무엇입니까? .NET은 적어도 3 AFAIK를 제공합니다. – leppie

+0

System.Timers 네임 스페이스의 Timer Class를 사용하고 있습니다. – necixy

+0

샘플 코드? SSCE plz (sscce.org) – Kiril

답변

3

lblTimer이 GUI 스레드에서 선언되었으므로 다른 스레드에서 업데이트하려고합니다. ->이 오류가 발생합니다.

link"UI가 아닌 스레드에서 WPF 컨트롤에 액세스"에는 문제에 대한 설명과 해결 방법이 포함되어 있습니다.

+0

감사합니다. Ando, ​​Thats working .... 계속하십시오! – necixy

+0

당신을 환영합니다;) – Ando

1

wpf에서 InvokeRequired가 작동하지 않습니다.

private void UpdateLabel(string tekst) 
    { 
     if (label.Dispatcher.CheckAccess() == false) 
     { 
      updateLabelCallback uCallBack = new updateLabelCallback(UpdateLabel); 
      this.Dispatcher.Invoke(uCallBack, tekst); 
     } 
     else 
     { 
    //update your label here 
     } 
    } 
:이 라벨을 업데이트하는 방법은

delegate void updateLabelCallback(string tekst); 

:

모듈 수준에서이 선언 :

적절한 방법 업데이트 다른 스레드가 소유 한 GUI 요소는 이것이다

11

.NET 4.0의 경우 DispatcherTimer를 사용하는 것이 훨씬 간단합니다. 이벤트 핸들러는 UI 스레드에 있으며 컨트롤의 속성을 직접 설정할 수 있습니다.

private DispatcherTimer updateTimer; 

private void initTimer 
{ 
    updateTimer = new DispatcherTimer(DispatcherPriority.SystemIdle); 
    updateTimer.Tick += new EventHandler(OnUpdateTimerTick); 
    updateTimer.Interval = TimeSpan.FromMilliseconds(1000); 
    updateTimer.Start(); 
} 

private void OnUpdateTimerTick(object sender, EventArgs e) 
{ 
    lblTimer.Content = "hello"; 
} 
관련 문제