WPF Zamanlayıcı C # Zamanlayıcı Gibi


177

WPF C # Zamanlayıcı Kontrolü gibi bir denetim nerede bulabilirim?

Yanıtlar:


325

Her zamanki WPF zamanlayıcısı, DispatcherTimerbir kontrol değil, kodda kullanılır. Temelde WinForms zamanlayıcı ile aynı şekilde çalışır:

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 hakkında daha fazla bilgiyi burada bulabilirsiniz


Merhaba, ben sevk zamanlayıcı kullanmaya çalışıyorum ama benim intelisense bulamıyorum benim kullanmak için eklenmesi gereken herhangi bir referans var mı?
yohannes

2
Bence aralığı belirleme şeklini seviyorum, sanırım milisaniyeden daha iyi.
JL.

Formunuzu kapatırken dispatcherTimer.Stop () yöntemini çağırdığınızdan emin olun. Zamanlayıcının WinForms sürümü bunu otomatik olarak yapar. (Bu, zamanlayıcıyı Kontrol etmenin avantajıdır.) Eğer yoksa, bir bellek sızıntısı ve muhtemelen başka hatalarınız olacaktır.
Ticaret Fikirleri Philip

7
@JL Eh? Bu kodu yorumlamak imkansız. Çok daha iyivar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

Dispatcher ile şunları eklemeniz gerekecek

using System.Windows.Threading;

Ayrıca DispatcherTimer'ı sağ tıklatıp Çöz'ü tıklattığınızda uygun başvuruları eklemesi gerektiğini unutmayın.


WindowsBase.dll btw referans eklemeniz gerekir
George Birbilis

16
IMHO, hangi kontrolün kullanılacağı ile ilgili soruya cevap vermez, sadece kabul edilen cevaba bazı yorumlar ekler.
Stephen Kennedy

3
Bunu 2012'de ekledim, sadece bir geliştirici olarak başladım, hala puan kazanıyorum. Ancak @StephenKennedy'in işaret ettiği gibi, bu bir yorum olmalıdır.
Malcor,


0

Zamanlayıcının özel işlevleri vardır.

  1. Eşzamansız bir zamanlayıcı veya eşzamanlı zamanlayıcı çağırın.
  2. Zaman aralığını değiştirme
  3. İptal etme ve devam ettirme yeteneği  

StartAsync ()veya kullanırsanız Start (), iş parçacığı kullanıcı arabirimi öğesini engellemez

     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;
        }
    }


     }

Kodunuzu açıklayabilir misiniz? Sadece bir kod gönderirseniz, insanlar bu koddan öğrenmez ve sadece web'den bir kod kopyalayıp yapıştırır.
Robert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.