SORU
9 EKİM 2012, Salı


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
9 EKİM 2012, Salı


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FlippinWindows | #1 Windows Tutorial Channel!

    FlippinWindo

    23 Mayıs 2010
  • Moodle

    Moodle

    11 Mayıs 2010
  • SRI International

    SRI Internat

    30 NİSAN 2008