2011-12-04 25 views
9

Belli bir senaryoyu aklıma almıyorum, ancak bu soru bir DispatcherTimer üzerinden bir Zamanlayıcı kullanmak isteyebileceğim senaryoları düşünürken aklımdan geçti.Timer vs DispatcherTime için performans

  1. kullanım a: Bir zamanlayıcı olayı harekete ve ardından kullanıcı arayüzüne minör değişiklikler yaptığınızda yoğun hesaplama gerektiren bir görevi gelip gerçekleştirmek zorunda senaryoda

    , bu kadar performans açısından daha iyi olurdu Düzenli Zamanlayıcı ve daha sonra uygulamanın Dispatcher'ı
  2. 'u kullanarak bir DispatcherTimer kullanın (ve muhtemelen hesaplama sırasında yoğun çalışmamam gerekiyor).

Tahminimce, UI iş parçacığı kilidini mümkün olduğunca uzun süre açık tutmak kullanıcı deneyimini artıracaktır. Bu tavsiye edilirse, böyle bir senaryoda bilmem gereken herhangi bir yaka var mı?

DÜZENLEME:

hissettiğim sorum yeterince açık değildi olsun, bu yüzden uydurma örnek olsa denemek ve somut eklemek için gidiyorum.

Her 2 dakikada bir büyük bir dosya okumalıyım ve işim bittiğinde bir ListBox'a bir öğe eklemem gerekiyor. Dosyayı okumayı/işlemeyi 10-15 saniye sürdüğümde, hiçbir UI çalışması yapmıyorum. Böyle bir şey için en iyi yaklaşım ne olurdu?

cevap

2

Daha fazla araştırma ve analizden sonra, düzenli bir zamanlayıcının yapılanma örneğinde en iyi sonucu verdiği sonucuna vardım. Şimdiye kadar, kodumda potansiyel sorunlara neden olabilecek spesifik bir şeye dikkat etmek zorunda kalmamıştım. Bunu söyledikten sonra, iyi kodlama uygulamaları asla incitmez!

1
  • Zamanlayıcı

  • DispatcherTimer zaman belirli bir aralıkla ve belirtilen öncelik işlenir Dağıtıcı sıraya entegre bir zamanlayıcı olan bir uygulama içinde yinelenen olay oluşturur.

Zamanlayıcılar zaman aralığı ortaya çıktığında tam olarak yürütmek için garanti edilmez, ancak zaman aralığı gerçekleşmeden önce değil garantilidir. Bunun nedeni, DispatcherTimer işlemlerinin diğer işlemler gibi Dispatcher sırasına yerleştirilmesidir. DispatcherTimer işlemi yürütüldüğünde, sıradaki diğer işlere ve önceliklerine bağlıdır.

Bir Zamanlayıcı WPF application'da kullanılıyorsa, Timer runs on a different thread then the user interface (UI) thread. Kullanıcı arabirimi (UI) dizisindeki nesnelere erişmek için işlemi, Invoke veya BeginInvoke kullanarak kullanıcı arabiriminin (UI) iş parçacığı Dispatcheri üzerine göndermek gerekir. Bir Zamanlayıcıya karşı bir DispatcherTimer kullanılmasının nedenleri, DispatcherTimer'in Dispatcher ve DispatcherPriority ile aynı iş parçacığı üzerinde çalışabilmesidir.

+1

Belki de sorumu açıklığa kavuşturmalıyım, ancak zaten bir zamanlayıcının ayrı bir iş parçacığı üzerinde çalıştığını ve bu durumda UI'ye dokunmak için bir Dispatcher gerektiğini bildiğimi zaten biliyorum. UI'ye dokunmak zorunda kaldığımda bile bir WPF uygulamasında Zamanlayıcı kullanmanın ne kadar değerli olabileceğini merak ettim. –

0

UI öğesine bağlanmış bir skaler (koleksiyon değil) değerini değiştirmek isterseniz, bunu yalnızca UI iş parçacığından (ör. Timer temsilcisinden) yapabilirsiniz. Ve bu durumda Dispatcher.Invoke/BeginInvoke kullanmanız gerekmez.

0

Başka bir seçenek de, her zamanlayıcı yinelemesinde BackgroundWorker sınıf örneği oluşturarak DispatcherTimer kullanmanızdır. Aynı zamanda birçok durumda Dispatcher.Invoke/BeginInvoke kullanmaktan kurtarır.

+0

Seçeneklerimin farkındayım :). * İdeal * seçeneğinin ne olacağı hakkında biraz bilgi arıyorum. –

5

Ana nokta:

Bu DispatcherTimer kullanılarak değil işaret eder

yoğun hesaplama gerektiren görevi gelip yerine getirmektir. Esas olarak ana iş parçacığı üzerinde küçük görevler gerçekleştirmek ve başka bir iş parçacığı oluşturmaktan kaçınmak için var.

Bir Backgroundworker'ı başlatmak için DispatcherTimer kullanıyorsanız, ana amacını atlatıyorsunuz demektir.

Sadece normal bir Zamanlayıcı kullanın.

+0

Düzenli bir Zamanlayıcı kullanırken bilmem gereken bir şey var mı? UI elemanlarının kilitlenmesine ihtiyaç duyabileceği bir yeri okuduğumu hatırlıyorum, ancak bunun gerekli/doğru olup olmadığından emin değilim. –

+1

Evet, GUI'yi güncelleştirirken Dispatcher.Invoke() öğesine ihtiyacınız olacak. Her zaman oldugu gibi. –

1

Comparing Timer with DispatcherTimer Buraya gönderilen bazı yanıtlar sorunuzu daha ayrıntılı olarak açıklıyor ancak bence bu bağlantı bazı genel bilgiler ve öneriler sunuyor.

İlgili konular