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.