2012-11-29 23 views
6

Bu oldukça basit bir sorundur, ancak her seferinde cevabı bulmaya çalıştığımda, Windows Zamanlanmış Görevler ile ilgili şeyler göstermeye devam ediyor ve bu durum böyle değil.Belirli bir zamanda bir yöntem çalıştırmayı zamanlama.

programım temelde şudur ki: O yorumların yerine koymak Neler

void StartDoingThings() 
{ 
    //At Specific System.DateTime 
    DoSomething() 

    //At another specific System.Datetime 
    DoSomethingElse() 
} 

bu yöntemlerin ayrı tarihsaat çalışacak şekilde neden.

Thread.Sleep() veya hatta System.Threading.Timers öğelerini kullanabilir ve (DateTimeOfEvent - DateTime.Now) temelli aralıklarla hesaplama yapabilirim, ancak söyleyeceğim bir şey var (programın hala çalışıyor olduğunu varsayarak): At 11/30/2012 tarihinde sabah 9:30:00, DoAnotherThing() yöntemini gerçekleştirin?

+3

Quartznet adlı bir çerçeve var, bir göz atın. http://quartznet.sourceforge.net/ –

+4

Zamanlanmış Görevleri görmeye devam etmenizin nedeni, bunun tam olarak ne için tasarlandığıdır. görevleri bir programda çalıştırmak için Her bir görev, her birinin kendi işlem çizelgesi olabilir ve zamanlayıcının ne zaman yürütüleceğini yönetmesine izin verebilir. –

+0

Anladığım kadarıyla (ki bu yanlış olabilir), Windows Görev Çizelgeleme, "X anda, bu programı çalıştırın" ve muhtemelen o programla birlikte çalışın. Başka bir program yürütmüyorum, sadece mevcut programımın içinde belirli bir zamana kadar beklemek istediğim bir şey istiyorum. Yanlışsam, kesinlikle anlamama yardımcı olur, ancak benim anlayışım göz önüne alındığında, Windows Görev Zamanlayıcı, zaten çalışan programımın belirli bir bölümünü belirli bir zamanda çalıştırmama yardımcı olmaz. – Xantham

cevap

4

Önceden belirlenmiş bir zamanda bir şeyler yapmak için bir yöntemi "zamanlamak" istiyorsanız, bunu yapmanın birkaç yolu vardır. Thread.Sleep() kullanmazdım, çünkü hiçbir şey yapmadan bir iş parçacığı bağlar, bu da bir kaynak israfıdır.

Yaygın bir uygulama, düzenli olarak zamanlanmış bir programda uyanan bir yoklama yöntemini kullanmaktır (bir dakika sonra diyelim) ve gerçekleştirilecek bir paylaşılan görev listesini gözden geçirin. System.Timer yoklama yöntemi için kullanılabilir:

aTimer = new System.Timers.Timer(10000); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

OnTimedEvent yöntemi gerçekleştirmek için "görevler" bir koleksiyon tutar kod içerebilir. Bir görevin zamanı geldiğinde, Zamanlayıcının bir sonraki çalışması yürütmesine neden olur.

+0

Yani, bir dateTime nesnesi verildiğinde bunu yapacak hiçbir şey yok mu? Belirli bir DateTime'da bir şey yapmanın böyle olağan bir şey gibi görünüyor. Programımdaki bazı görevler aralarında birkaç saniyeye kadar gecikmelere ve birkaç saate kadar olabilir ve açıkça her şeyi kontrol etmesini söyler. ikincisi, muhtemelen gerekenden daha fazla kaynak tüketecektir. – Xantham

+0

İnşa edilmemesinin sebebi, sistem zamanının değiştirilebileceği, yanlış anlaşılmalara yol açabileceği (hiçbir zaman "gitmeyen" programlardır) –

+0

Bunun mantıklı olduğunu sanıyorum, ama sanırım bunun değişme riski olduğunu sanırım Zamanlanmış bir görev yaparken sistem saatini.Zaman içinde bir senkronizasyon değişikliği olsaydı, tam zamanı beklemek yerine (eğer bir zaman senkronizasyonu sırasında atlanabiliyorsa) bir if (time> set_time) komutunu çalıştırırlardı diye düşünürdüm. – Xantham

İlgili konular