2011-04-21 12 views
11

Bir System.Timers.Timer kullanıyorum ve bir C# windows hizmetimde OnStart yöntemimde aşağıdaki gibi bir kod var.Yangın zamanlayıcısı OnStart penceresinden hemen hizmete giriyor

timer = new Timer(); 
timer.Elapsed += timer_Elapsed; 
timer.Enabled = true; 
timer.Interval = 3600000; 
timer.Start(); 

Bu timer_Elapsed kod ben hizmetini başlattıktan sonra bir saat başlayarak her saat yürütülecek neden olur. Ben hizmet ve daha sonra sonradan her saat başladıkları o noktada yürütmek almak için herhangi bir yolu var mı?

timer_Elapsed tarafından çağrılan yöntem, doğrudan OnStart'dan aramak için çok uzun sürüyor.

+0

Zamanlayıcıdan sonra çağırırsanız herhangi bir sorun var.Start()? – V4Vendetta

cevap

19

Sadece Timer gibi çalışan işlevini çağırmak için bir iş parçacığı iş parçacığı başlatmanız yeterlidir. Şunun gibi: Bu tür olarak yerine System.Timers.Timer ait

 timer.Elapsed += timer_Elapsed; 
     ThreadPool.QueueUserWorkItem((_) => DoWork()); 
    ... 

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { 
     DoWork(); 
    } 

    void DoWork() { 
     // etc... 
    } 
1

Kullanım System.Threading.Timer sınıfına Threading Timer için sadece bir sarıcı.

Aynı zamanda ihtiyacı uygun.

System.Threading.Timer timer = 
       new System.Threading.Timer(this.DoWork, this, 0, 36000); 

Here detaylar.

+0

ben yaptım ama burada en azından çalıştı olmadı. Zaman başlatılır hemen önce yöntemini çalıştırır ama onStart içerisinde çalışan ve(). – Thiago

2

System.Timers.Timer öğesinin AutoReset özelliğini kullanın ve değeri "true" olarak ayarlayın. o timer.Enabled = true aynı işi yapar çünkü gerek yok timer.Start() kullanmak; Zamanlayıcı, belirtilen süre tamamlandıktan geçen olay her yükseltmek gerektiğini belirten bir değere ayarlar

timer = new Timer(); 
timer.Elapsed += timer_Elapsed; 
timer.Enabled = true; 
timer.Interval = 3600000; 
timer.AutoReset = true; 

Autoreset = doğru.

0

Timer ürününüzün hemen tetiklenmesini istiyorsanız, Timer nesnesini belirli bir aralığa gerek duymadan basitçe başlatabilirsiniz (varsayılan olarak hemen hemen: 100ms olan varsayılan değer olarak P olacaktır), daha sonra aranan işlevdeki aralığı Beğendiğiniz. Burada Windows Hizmetimde kullandığım bir örnek:

private static Timer _timer; 

protected override void OnStart(string[] args) 
{ 
    _timer = new Timer(); //This will set the default interval 
    _timer.AutoReset = false; 
    _timer.Elapsed = OnTimer; 
    _timer.Start(); 
} 

private void OnTimer(object sender, ElapsedEventArgs args) 
{ 
    //Do some work here 
    _timer.Stop(); 
    _timer.Interval = 3600000; //Set your new interval here 
    _timer.Start(); 
}