Sistem çalışıyor.İş parçacığı.C zamanlayıcı#
Timer nesnesi oldum. Her dakika çalıştırmak istiyorum. Özellikle, OnCallBack
bir yöntem çalıştırın ve OnCallBack
bir yöntem çalışırken etkin olur. OnCallBack
bir yöntem tamamlandıktan sonra, (OnCallBack
) zamanlayıcıyı yeniden başlatır.
Şimdi ne var burada:
private static Timer timer;
private static void Main()
{
timer = new Timer(_ => OnCallBack(), null, 0, 1000 * 10); //every 10 seconds
Console.ReadLine();
}
private static void OnCallBack()
{
timer.Change(Timeout.Infinite, Timeout.Infinite); //stops the timer
Thread.Sleep(3000); //doing some long operation
timer.Change(0, 1000 * 10); //restarts the timer
}
Ancak, çalışmıyor gibi görünüyor. Çok hızlı her 3 saniye çalışır. Eğer bir süre (1000*10) zam bile. 1000 * 10
kör bir göz çıkıyor gibi görünüyor
Ben yanlış ne yaptım?
CEVAP
Bu Sistemi doğru kullanım değil.İş parçacığı.Zamanlayıcı. Zamanlayıcı örneğini, hemen hemen her zaman aşağıdakileri yapmanız gerekir:
_timer = new Timer( Callback, null, TIME_INTERVAL_IN_MILLISECONDS, Timeout.Infinite );
Bu aralığı geçtiğinde sadece bir kez onay için zamanlayıcı eğitecektir. Geri arama fonksiyonu çalışma, daha önce tamamlandığında zamanlayıcı Değiştirin. Örnek:
private void Callback( Object state )
{
// Long running operation
_timer.Change( TIME_INTERVAL_IN_MILLISECONDS, Timeout.Infinite );
}
Böylece eşzamanlılık yoktur çünkü kilitleme mekanizmaları için gerek yok. Zamanlayıcı bir sonraki aralığı, uzun süren operasyonun zamanı geçtikten sonra ileri geri ateş edecek.
Eğer tam olarak N milisaniye de zamanlayıcı çalıştırmak istiyorsanız, o zaman size uzun süren operasyon Kronometreyi kullanarak süre ölçebilir öneririm ve Değişim yöntemi uygun şekilde çağırın:
private void Callback( Object state )
{
Stopwatch watch = new Stopwatch();
watch.Start();
// Long running operation
_timer.Change( Math.Max( 0, TIME_INTERVAL_IN_MILLISECONDS - watch.ElapsedMilliseconds ), Timeout.Infinite );
}
DÜZENLEME:
Bengüçlükimsenin yapmaya teşvik etmek .Ve Jeffrey Richter kitabı okumayan - . CLR kullanarak NET ^strong>C) CLR#en kısa sürede okumak için. Zamanlayıcılar ve iş parçacığı havuzu harika detaylar burada açıklanmıştır.
Sistem.Zamanlayıcılar.Timer vs Sistemi...
Neden bir Sistem yok.Zamanlayıcılar.Za...
Ne zaman App Engine zamanlayıcı yeni b...
Sistem için Görev temelli bir değişikl...
Nasıl HttpServerUtility erişmek için.B...