TOC

This article is currently in the process of being translated into Korean (~95% done).

Misc.:

The DispatcherTimer

WinForms 안에는 Timer라는 컨트롤이 있습니다. 그것은 일정 시간 간격을 두고 어떤 행동을 반복 수행합니다. WPF 역시 이것이 가능합니다. 다만, 보이지 않는 컨트롤 대신, 우리는 DispatcherTimer 컨트롤을 가집니다. 그것은 완전히 동일한 것이나, 당신의 Form에 넣는 것이 아닌 Code-behind 코드로 부터 배타적으로 그것을 생성하고 사용합니다.

DispathcerTimer 클래스는 시간 간격(Interval)을 정하고 이 시간 간격을 매번 발생하는 Tick 이벤트를 구독함으로써 동작합니다. DispathcherTimer는 Start() 매소드를 호출하거나 IsEnabled 속성이 true로 셋 되기 전엔 시작되지 않습니다.

그럼 DispatcherTimer를 디지털 시계를 만들기 위해 사용하는 간단한 예제를 시도해 봅시다.

<Window x:Class="WpfTutorialSamples.Misc.DispatcherTimerSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DispatcherTimerSample" Height="150" Width="250">
    <Grid>
        <Label Name="lblTime" FontSize="48" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</Window>
using System;
using System.Windows;
using System.Windows.Threading;

namespace WpfTutorialSamples.Misc
{
	public partial class DispatcherTimerSample : Window
	{
		public DispatcherTimerSample()
		{
			InitializeComponent();
			DispatcherTimer timer = new DispatcherTimer();
			timer.Interval = TimeSpan.FromSeconds(1);
			timer.Tick += timer_Tick;
			timer.Start();
		}

		void timer_Tick(object sender, EventArgs e)
		{
			lblTime.Content = DateTime.Now.ToLongTimeString();
		}
	}
}

XAML 파트는 극도로 간단합니다. 그것은 단순히 현재의 시간을 표시하기 위해 사용되는 큰 폰트 사이즈를 가지고 가운데 정렬을 한 하나의 라벨입니다.

Code-behind는 이 예제의 마법이 일어나는 장소입니다. 윈도우의 생성자(constructor)속에서 우리는 DispatcherTimer 인스턴스를 생성합니다. 우리는 Interval 속성을 1초로 세팅하고 그 Tick 이벤트를 구독합니다. 그리고 우리는 그 timer를 시작합니다. Tick 이벤트 내에서 우리는 현재의 시간을 보여주기 위해 그 라벨을 쉽게 업데이트 합니다.

물론, DispatcherTimer는 더 작거나 더 큰 시간 간격으로 동작할 수 있습니다. 예를 들어 당신은 어떤 일이 매 30초 또는 5분 마다 일어나길 원할 수 있습니다. - FromSeconds 또는 FromMinutes 같은 TimeSpan.From* 매소드를 사용하거나 당신의 요구를 꼭 만족시키는 새로운 TimeSpan 인스턴스를 생성하세요.

DispatcherTimer가 무엇이 가능한지 보기 위해, 더 자주 업데이트 시켜봅시다. 매우 매우 더 자주!

using System;
using System.Windows;
using System.Windows.Threading;

namespace WpfTutorialSamples.Misc
{
	public partial class DispatcherTimerSample : Window
	{
		public DispatcherTimerSample()
		{
			InitializeComponent();
			DispatcherTimer timer = new DispatcherTimer();
			timer.Interval = TimeSpan.FromMilliseconds(1);
			timer.Tick += timer_Tick;
			timer.Start();
		}

		void timer_Tick(object sender, EventArgs e)
		{
			lblTime.Content = DateTime.Now.ToString("HH:mm:ss.fff");
		}
	}
}

여러분이 보시는 것 같이, 우리는 이제 DispathcerTimer가 매 밀리세컨드(1/1000초)마다 쏘아대도록 요청합니다. Tick 이벤트 안에서 우리는 사용자 정의 시간 포맷 문자열을 사용하며 이는 라벨에서 밀리세컨드를 보여줍니다. 이제 여러분은 쉽게 스탑워치로 사용될 수 있는 뭔가를 가지게 되었습니다. - 단지 몇 개의 버턴들을 그 Window에 추가하고 그 버턴들이 Stop(), Start() 그리고 Restart() 매소드를 그 타이머에서 호출할 수 있게 해 주면 됩니다.

Summary

여러분의 응용프로그램에서 주어진 시간 간격에 맞춰 발생하는 뭔가를 필요로 할 다양한 상황들이 있으며, 이 때 DispatcherTimer를 사용하여 쉽게 해결할 수 있습니다. 단지 이것만은 알아두십시오. 당신이 당신의 Tick 이벤트 속에서 뭔가 복잡한 것을 해야 한다면, 그것은 너무 자주 동작하지 않아야 합니다. 마치 마지막 예제에서 밀리세컨드 마다 타이머의 tick들이 발생했던 것 처럼 말이죠. 그것은 컴퓨터가 당신의 응용프로그램을 실행하는데 무거운 과로를 부담시키게 될 것 입니다.

또한 이것도 알아두십시오. DispatcherTimer는 모든 상황에서 100% 정확하진 않다는 사실입니다. 그 tick 동작들은 Dispatcher 큐에 위치하며, 따라서 만약 그 컴퓨터가 많은 부하를 가지고 있다면, 당신의 조작은 아마 지연될 것입니다. .NET 프레임워크는 그 Tick 이벤트를 켤코 너무 일찍 발생하지 않을 것을 약속합니다만, 그것이 약간 늦지 않도록 발생하는 것을 보증하진 않습니다. 그러나 대부분의 사용 상에서 보면, DispatcherTimer는 충분히 정밀합니다.

만약 당신이 그 큐에서 더 높은 우선순위를 가지는 timer를 필요로 한다면, 당신은 DispatcherTimer 우선순위에 어떤 값을 보냄으로써 DispatcherPriority를 세팅할 수 있습니다. 이에 관한 더 자세한 내용은 이 MSDN article에서 찾아보실 수 있습니다.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!