Membandingkan Timer dengan DispatcherTimer


98

apa bedanya between System.Windows.Forms.Timer()dan System.Windows.Threading.DispatcherTimer()? Dalam kasus mana, kita harus menggunakannya? ada praktik terbaik?

Jawaban:


111

Windows.Forms.Timermenggunakan loop pesan bentuk jendela untuk memproses peristiwa timer. Ini harus digunakan saat menulis kejadian waktu yang sedang digunakan dalam aplikasi Windows Forms, dan Anda ingin pengatur waktu diaktifkan pada utas UI utama.

DispatcherTimeradalah mekanisme waktu WPF. Ini harus digunakan ketika Anda ingin menangani pengaturan waktu dengan cara yang sama (meskipun ini tidak terbatas pada satu utas - setiap utas memiliki operatornya sendiri) dan Anda menggunakan WPF. Ini mengaktifkan acara di utas yang sama dengan Dispatcher.

Secara umum, WPF == DispatcherTimerdan Windows Forms == Forms.Timer.

Bisa dikatakan, ada juga System.Threading.Timer, yang merupakan pengatur waktu classyang menyala pada utas terpisah. Ini bagus untuk pengaturan waktu numerik murni, di mana Anda tidak mencoba memperbarui UI, dll.


1
Terima kasih atas tanggapan yang cepat. Jadi ini berarti, setiap kali saya ingin memiliki pengatur waktu yang terkait dengan UI, saya harus menggunakan DispatcherTimer, dan ketika saya ingin mengaktifkan pengatur waktu, yang saya tidak ingin membekukan UL, saya harus menggunakan System.Threading.Timer secara terpisah benang. Pertanyaan kedua adalah: jika saya ingin menggunakan DispatcherTimer, dan saya ingin memiliki pengatur waktu yang tidak terikat pada UI, haruskah saya menyebutnya dalam utas terpisah dengan menggunakan System.Threading.Timer atau masih DisptacherTimer?
paradisonoir

3
Itu tergantung pada apa yang Anda coba lakukan. Saya jarang menggunakan System.Threading.Timer - Saya biasanya akan tetap menggunakan Dispatcher Timer, dan kemudian melakukan WORK Anda (yang dapat memblokir UI Anda) di thread lain, menggunakan sesuatu seperti BackgroundWorker. Pengatur waktu seharusnya tidak pernah memblokir UI Anda, kecuali Anda melakukan "terlalu banyak" pekerjaan di event handler mereka.
Reed Copsey

Saya mengalami masalah dengan DispatcherTimer yang memakan prosesor dari waktu ke waktu. Apakah ada cara yang baik untuk mengatasinya?
discorax

Periksa untuk melihat apa yang secara spesifik memakan cpu. Apakah Anda membuat banyak pengatur waktu, yang tidak dihentikan?
Reed Copsey

3
Pastikan Anda menyetel properti interval dengan benar. Jangan lakukan ini: timer1.Interval = new TimeSpan (1000); // "1000" mewakili kutu, bukan milidetik! CPU sangat tinggi, sampai saya memperbaikinya dengan ini: timer1.Interval = System.TimeSpan.FromSeconds (1);
Lonnie Best

4

Saya telah menemukan artikel bagus tentang pengatur waktu dengan contoh kecil di sini: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

Sebagai sebuah kesimpulan:

Jika DoSomething () memanipulasi komponen GUI maka dengan Timer Anda perlu menggunakan: this.Dispatcher.Invoke ((Action) delegate {// GUI RELATED CODE HERE} karena Anda tidak dapat mengakses kontrol GUI dari thread berbeda secara langsung. Dengan DispatcherTimer Anda melakukannya tidak perlu melakukan itu.

Jika DoSomething () melakukan tugas yang memakan waktu, maka GUI akan berhenti dalam kasus DispatcherTimer. Dalam kasus Timer, itu tidak akan terjadi karena metode panjang dijalankan di utas yang berbeda

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.