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?

paradisonoir
sumber

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.

Reed Copsey
sumber
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

Seekeer
sumber