programing

작업 스케줄러의 WPF 앱에서 DispatcherTimer와 일반 타이머의 비교

showcode 2023. 4. 20. 23:24
반응형

작업 스케줄러의 WPF 앱에서 DispatcherTimer와 일반 타이머의 비교

이 항목에서 @Kent Boogaart가 멀티스레딩 WPF 앱에서 작업 공유기로 사용하기 위해 의도한 "DispatcherTimer"와 "일반 타이머"의 차이를 설명하십시오.

WPF 어플리케이션의 멀티스레딩 전략에 필요한 조언

게시물 중 하나에 대한 코멘트에서 다음을 수행합니다.

DispatcherTimer가 하는 일이 다른 스레드를 시작하는 것뿐이라면 DispatcherTimer를 사용하는 이유는 무엇입니까?… UI 스레드에서 시작할 필요가 없습니다.일반 타이머를 사용하면 UI가 완전히 중단되는 것을 방지할 수 있습니다.

"일반 타이머"란 무엇을 의미합니까?UI에 미치는 영향('디스패처 타이머'와 '일반 타이머')은 어떻게 다릅니까?

(이 투고를 읽기 전까지는 DispatcherTimer를 WPF에서 타이머를 자연스럽게 사용하는 방법이라고 생각했습니다.이것이 사실이 아닌 경우는 어떤 경우입니까?

DispatcherTimer는 정규 타이머입니다.UI 스레드에서 Tick 이벤트를 실행하므로 UI를 사용하여 원하는 작업을 수행할 수 있습니다.시스템.Timers.Timer는 비동기 타이머이며 경과 이벤트는 스레드 풀 스레드에서 실행됩니다.이벤트 핸들러에서는 UI 구성 요소나 데이터 바인딩 변수를 터치할 수 없으므로 매우 주의해야 합니다.또한 UI 스레드에서도 사용되는 클래스 멤버에 액세스할 때 lock 문을 사용해야 합니다.

링크된 응답에서는 OP가 의도적으로 코드를 비동기적으로 실행하려고 했기 때문에 Timer 클래스가 더 적절했습니다.

Regular Timer's Tick 이벤트는 실제로 Timer가 생성된 스레드에서 실행되므로 틱이벤트에서는 UI를 사용하여 접근하려면 다음과 같이 dispatcher.begininvoke를 통과해야 합니다.

RegularTimer_Tick(object sender, EventArgs e)
{
    txtBox1.Text = "count" + i.ToString(); 
    // error can not access
    // txtBox1.Text property outside dispatcher thread...

    // instead you have to write...
    Dispatcher.BeginInvoke( (Action)delegate(){
       txtBox1.Text = "count " + i.ToString();
    });
}

디스패처 타이머의 경우 다음과 같이 호출 또는 호출을 시작하지 않고 UI 요소에 액세스할 수 있습니다.

DispatcherTimer_Tick(object sender, EventArgs e)
{
    txtBox1.Text = "Count " + i.ToString();
    // no error here..
}

DispatcherTimer는 일반 타이머보다 UI 오브젝트에 쉽게 접근할 수 있는 편의성을 제공합니다.

.NET 4.5 에서는, 다음의 커맨드를 작성할 수도 있습니다.async를 사용해야 할 경우 타이머를 위임합니다.NET 4.5await기능성.

        var timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(20);
        timer.Tick += new EventHandler(async (object s, EventArgs a) =>
        {
            Message = "Updating...";
            await UpdateSystemStatus(false);  
            Message = "Last updated " + DateTime.Now;              
        });
        timer.Start();

언급URL : https://stackoverflow.com/questions/2258830/dispatchertimer-vs-a-regular-timer-in-wpf-app-for-a-task-scheduler

반응형