Zamanlayıcıyı DispatcherTimer ile Karşılaştırma


98

fark nedir between System.Windows.Forms.Timer()ve System.Windows.Threading.DispatcherTimer()? Hangi durumlarda kullanmalıyız? herhangi bir en iyi uygulama?

Yanıtlar:


111

Windows.Forms.Timertimer olaylarını işlemek için windows formları mesaj döngüsünü kullanır. Windows Forms uygulamalarında kullanılan zamanlama olayları yazılırken kullanılmalıdır ve zamanlayıcının ana UI iş parçacığında çalışmasını istiyorsanız.

DispatcherTimerWPF zamanlama mekanizmasıdır. Zamanlamayı benzer bir şekilde işlemek istediğinizde kullanılmalıdır (bu tek bir iş parçacığı ile sınırlı olmasa da - her iş parçacığının kendi dağıtıcısı vardır) ve siz WPF kullanıyorsunuz. Olayı Dağıtıcı ile aynı iş parçacığında tetikler.

Genel olarak WPF == DispatcherTimerve Windows Forms == Forms.Timer.

Bununla birlikte, ayrı bir iş parçacığı üzerinde çalışan System.Threading.Timerbir zamanlayıcı da classvar. Bu, kullanıcı arayüzünü vb. Güncellemeye çalışmadığınız tamamen sayısal zamanlama için iyidir.


1
Hemen yanıt verdiğiniz için teşekkürler. Yani bu, kullanıcı arayüzü ile ilgili bir zamanlayıcıya sahip olmak istediğimde DispatcherTimer kullanmalıyım ve UL'yi dondurmak istemediğim bir zamanlayıcıyı ateşlemek istediğimde System.Threading.Timer'ı ayrı bir Konu. İkinci soru şudur: DispatcherTimer kullanmak istiyorsam ve UI'ye bağlı olmayan bir zamanlayıcıya sahip olmak istiyorsam, onu System.Threading.Timer kullanarak ayrı bir iş parçacığında mı yoksa hala DisptacherTimer mı çağırmalıyım?
paradisonoir

3
Ne yapmaya çalıştığına bağlı. System.Threading.Timer'ı nadiren kullanırım - Genellikle Dispatcher Timer'a bağlı kalırdım ve ardından WORK'ünüzü (UI'nizi engelleyebilecek olan) başka bir iş parçacığında BackgroundWorker gibi bir şey kullanarak yaparım. Zamanlayıcılar, olay işleyicilerinde "çok fazla" iş yapmadığınız sürece kullanıcı arayüzünüzü asla engellememelidir.
Reed Copsey

DispatcherTimer'ın zamanla işlemciyi tüketmesiyle ilgili bir sorun yaşıyorum. Bunu halletmenin iyi bir yolu var mı?
discorax

İşlemciyi özellikle neyin yediğini kontrol edin. Durdurulmayan çok sayıda zamanlayıcı mı oluşturuyorsunuz?
Reed Copsey

3
İnterval özelliğini doğru ayarladığınızdan emin olun. Bunu yapmayın: timer1.Interval = new TimeSpan (1000); // "1000" milisaniyeleri değil keneleri temsil eder! Bunu şu şekilde düzeltene kadar CPU süper yüksekti: timer1.Interval = System.TimeSpan.FromSeconds (1);
Lonnie Best

4

Burada küçük örneklerle zamanlayıcılar hakkında güzel bir makale buldum: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

Sonuç olarak:

DoSomething () GUI bileşenlerini işlerse, Timer ile birlikte kullanmanız gerekir: this.Dispatcher.Invoke ((Action) delegate {// GUI RELATED CODE HERE} çünkü farklı bir iş parçacığından doğrudan GUI denetimlerine erişemezsiniz. DispatcherTimer ile bunu yaparsınız. bunu yapmaya gerek yok.

DoSomething () zaman alıcı bir görev olarak gerçekleştirirse, DispatcherTimer durumunda GUI donacaktır. Zamanlayıcı durumunda, uzun metot farklı bir iş parçacığında yürütüldüğü için olmayacak

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.