Timer WPF Seperti Timer C #


177

Di mana saya dapat menemukan kontrol yang seperti Kontrol Timer C # di WPF?

Jawaban:


325

Timer WPF biasa adalah DispatcherTimer, yang bukan merupakan kontrol tetapi digunakan dalam kode. Ini pada dasarnya bekerja dengan cara yang sama seperti timer 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
}

Lebih lanjut tentang DispatcherTimer dapat ditemukan di sini


Hai, saya sudah mencoba menggunakan timer pengiriman tetapi saya tidak dapat menemukannya di intelisense saya apakah ada referensi yang perlu ditambahkan agar saya dapat menggunakannya?
yohannes

2
Saya suka cara Anda mengatur interval, lebih baik daripada milidetik menurut saya.
JL.

Pastikan untuk memanggil dispatcherTimer.Stop () saat Anda menutup formulir Anda. Versi WinForms dari timer melakukan itu secara otomatis. (Itulah keuntungan menjadikan pengatur waktu sebagai Kontrol.) Jika tidak, Anda akan mengalami kebocoran memori dan kemungkinan bug lainnya.
Ide Dagang Philip

7
@ JS Eh? Kode itu tidak mungkin untuk ditafsirkan. Jauh lebih baik adalahvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

Dengan Dispatcher Anda harus memasukkan

using System.Windows.Threading;

Juga perhatikan bahwa jika Anda mengklik kanan DispatcherTimer dan mengklik Menyelesaikan itu harus menambahkan referensi yang sesuai.


perlu menambahkan referensi ke WindowsBase.dll btw
George Birbilis

16
IMHO ini tidak menjawab pertanyaan tentang kontrol mana yang digunakan, itu hanya menambahkan beberapa komentar untuk jawaban yang diterima.
Stephen Kennedy

3
Saya menambahkan ini pada 2012, hanya benar-benar mulai sebagai pengembang, saya masih mendapatkan poin untuk itu. Tetapi seperti yang ditunjukkan oleh @StephenKennedy, ini harus menjadi komentar.
Malcor


0

Timer memiliki fungsi khusus.

  1. Panggil timer tidak sinkron atau timer sinkron.
  2. Ubah interval waktu
  3. Kemampuan untuk membatalkan dan melanjutkan  

jika Anda menggunakan StartAsync ()atau Start (), utas tidak memblokir elemen antarmuka pengguna

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


     }

Bisakah Anda menjelaskan kode Anda? Jika Anda hanya memposting beberapa kode, orang tidak akan belajar darinya dan hanya menyalin & menempelkan beberapa kode dari web.
Robert
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.