C # 타이머와 같은 WPF 타이머


177

WPF의 C # Timer Control과 같은 컨트롤을 어디에서 찾을 수 있습니까?

답변:


325

일반적인 WPF 타이머는 DispatcherTimer컨트롤이 아니라 코드에 사용되는입니다. 기본적으로 WinForms 타이머와 같은 방식으로 작동합니다.

System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();


private void dispatcherTimer_Tick(object sender, EventArgs e)
{
  // code goes here
}

DispatcherTimer에 대한 자세한 내용은 여기를 참조하십시오.


안녕하세요, 디스패치 타이머를 사용하려고했지만 내 인텔리전스에서 찾을 수 없습니다. 사용하려면 추가 해야하는 참조가 있습니까?
yohannes

2
나는 당신이 간격을 설정하는 방식을 좋아합니다. 제 생각에는 밀리 초보다 낫습니다.
JL.

양식을 닫을 때 dispatcherTimer.Stop ()을 호출하십시오. 타이머의 WinForms 버전은 자동으로 수행합니다. (타이머를 컨트롤로 만드는 것이 장점입니다.) 그렇지 않으면 메모리 누수와 다른 버그가있을 수 있습니다.
무역 아이디어 필립

7
@JL 어? 이 코드는 해석이 불가능합니다. 훨씬 더 나은var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

Dispatcher를 사용하면 다음을 포함해야합니다.

using System.Windows.Threading;

또한 DispatcherTimer를 마우스 오른쪽 단추로 클릭하고 해결을 클릭하면 적절한 참조가 추가되어야합니다.


WindowsBase.dll에 대한 참조를 추가해야합니다. btw
George Birbilis

16
IMHO 이것은 어떤 컨트롤을 사용해야하는지에 대한 질문에 대답하지 않고 단지 받아 들여진 답변에 주석을 추가합니다.
Stephen Kennedy

3
나는 이것을 개발자로 시작하여 2012 년에 이것을 추가했지만 여전히 포인트가 있습니다. 그러나 @StephenKennedy가 지적했듯이 이것은 주석이어야합니다.
Malcor


0

타이머에는 특별한 기능이 있습니다.

  1. 비동기 타이머 또는 동기 타이머를 호출하십시오.
  2. 시간 간격 변경
  3. 취소 및 재개 가능  

당신이 사용하는 경우 StartAsync ()또는 Start ()스레드는 사용자 인터페이스 요소를 차단하지 않습니다

     namespace UITimer


     {
        using thread = System.Threading;
        public class Timer
        {

        public event Action<thread::SynchronizationContext> TaskAsyncTick;
        public event Action Tick;
        public event Action AsyncTick;
        public int Interval { get; set; } = 1;
        private bool canceled = false;
        private bool canceling = false;
        public async void Start()
        {
            while(true)
            {

                if (!canceled)
                {
                    if (!canceling)
                    {
                        await Task.Delay(Interval);
                        Tick.Invoke();
                    }
                }
                else
                {
                    canceled = false;
                    break;
                }
            }


        }
        public void Resume()
        {
            canceling = false;
        }
        public void Cancel()
        {
            canceling = true;
        }
        public async void StartAsyncTask(thread::SynchronizationContext 
        context)
        {

                while (true)
                {
                    if (!canceled)
                    {
                    if (!canceling)
                    {
                        await Task.Delay(Interval).ConfigureAwait(false);

                        TaskAsyncTick.Invoke(context);
                    }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }

        }
        public void StartAsync()
        {
            thread::ThreadPool.QueueUserWorkItem((x) =>
            {
                while (true)
                {

                    if (!canceled)
                    {
                        if (!canceling)
                        {
                            thread::Thread.Sleep(Interval);

                    Application.Current.Dispatcher.Invoke(AsyncTick);
                        }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }
            });
        }

        public void StartAsync(thread::SynchronizationContext context)
        {
            thread::ThreadPool.QueueUserWorkItem((x) =>
            {
                while(true)
                 {

                    if (!canceled)
                    {
                        if (!canceling)
                        {
                            thread::Thread.Sleep(Interval);
                            context.Post((xfail) => { AsyncTick.Invoke(); }, null);
                        }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }
            });
        }
        public void Abort()
        {
            canceled = true;
        }
    }


     }

코드를 설명 할 수 있습니까? 코드를 게시 만하면 사람들이 코드를 배우지 않고 웹에서 코드를 복사하여 붙여 넣기 만하면됩니다.
Robert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.