2012-02-09 18 views
7

ile düzgün çalışmıyor Neden bir Windows hizmeti yazmak zorunda kaldım. Bir URL'yi periyodik olarak istemek ve uygunluğunu kontrol etmem gerekiyordu. Bunun için servisin OnStart yönteminde bir zamanlayıcıyı başlatmaya karar verdim ve tüm çalışmaları timer_Tick olayında yapın.Neden Windows Service, System.Timers.Timer veya System.Windows.Forms.Timer

İlk yaklaşımım System.Windows.Forms.Timer ve Tick olay kullanıyordu. Okuduğum dersten dolayı bunun için seçtim. Her nasılsa ben hizmet çalışma yapamadık. Sorun çıkarmadan kuruldu ve başlatıldı, ancak olayı tetiklemedi (hata ayıklayıcısını sürece ekledim ve işten çıkmadığını gördüm). Windows hizmetinde Forms zamanlayıcı kullanmanın iyi bir fikir olmadığını düşündüm, bu yüzden System.Timers.Timer'a geçmeye ve Elapsed olayını kullanmaya karar verdim. Bu da işe yaramadı. Bir Windows Forms uygulamasında her iki yaklaşımını da denedim ve ikisi de çalıştı. System.Threading.Timer: blogger tavsiyeleri henüz başka zamanlayıcı kullanmak için http://weblogs.asp.net/sibrahim/archive/2004/01/13/58429.aspx hangi tarih:

bazı kazma sonra ben bu siteyi buldum. Üçüncü kez yaklaşımı değiştirdim ve BOOM bir çekicilik gibi çalışmaya başladı.

Soruma sorum: neden Windows hizmetlerinde diğer zamanlayıcıları kullanamıyorum ve bunun hakkında bir bilgi bulmak neden bu kadar zor?

+1

Bu makaleyi, farklı .NET zamanlayıcılarını karşılaştırarak buldum. Kesinlikle okumaya değer: http://msdn.microsoft.com/en-us/magazine/cc164015.aspx –

+0

"System.Threading.Timer", Windows Server 2008 R2'de benim için çalışan ancak Timers'ta çalışan tek kişidir. Timer, Windows 7 dizüstü bilgisayarımda çalıştı. – Lijo

cevap

8

System.Windows.Forms.Timer zaman sayacı, tick olayını sıralamak için UI'nin ileti pompasını kullanır; bir hizmet, bir pompa pompasını varsayılan olarak çalıştırmaz; dolayısıyla, fazladan bir iş olmadan, System.Windows.Forms.Timer zamanlayıcılar çalışmayacaktır.

System.Timers.Timer sunucu tabanlı bir zamanlayıcıdır ve oluşturduğunuz iş parçacığı üzerinde bir olayı kaldırır (Sanırım). Bu işe yaramazsa, belki de zamanlayıcıyı başlatmıyorsunuz veya zamanlayıcı hemen biten bir iş parçacığı üzerinde çalışıyor (örneğin hiçbir şey iş parçacığını canlı tutuyor, böylece iş bitiriyor).

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

System.Threading.Timer zamanlayıcı bir ThreadPool parçacığı üzerinde çalışır ve hiç mesaj pompasına bağlı olmayan bir geri arama kullanır, dolayısıyla bu çalıştı.

Bir WinForms projesinde Application.Run(myForm) çalıştırdığınızda, bu çağrı da ileti pompasını çalıştırır, bu UI iletilerini yönetir. Bahseddiğiniz windows zamanlayıcı, bir UI bileşeni olup, UI iş parçacığında onaylama olayının oluşmasına neden olmak için ileti pompasının çalışmasını bekler.

bir Windows hizmeti bir mesaj pompasını çalıştırmak için buraya bir göz atın:

Message pump in .NET Windows service

fazla okuma: Sonuç olarak

http://support.microsoft.com/kb/842793

, sadece System.Threading.Timer gelirdim sınıf.

+2

Bu zamanlayıcıların ikisi de kod iş parçacığı üzerinde kod çalıştırır. Olay/geri çağırma işleminin, zamanlayıcıyı oluşturan aynı iş parçacığında çalıştırılması sihir gerektirir. Mesaj pompasının sağladığı büyü türü. –

İlgili konular