2016-03-29 26 views
0

Bir # döngü döngüsünü uygulamaya çalışıyorum (kodun çalıştırılacağı her 30 milisaniye belirtilmelidir). Bu kadar zor değil, çünkü SO bu soruları daha önce this ya da this one gibi bu konuya yöneltti.Zamanlayıcı döngüde C#, kodun tamamlanıp tamamlanmadığını bekleyin

En zor kısmı, kod parçasının döngü süresinden daha uzun sürebileceğidir. Bu durumda, bitene kadar beklemek istiyorum (30 ms bekle).

Örnek:

0 ms - Birinci yineleme: 20 ms tamamlanmış kodu.

30 ms - İkinci yineleme: kod zamanında tamamlanmadı.

60 msn - ikinci yineleme kodunun bitmesini bekleyin. Toplam 41 ms içinde sona erdi.

71 ms - Üçüncü yineleme: kod 15 ms içinde tamamlandı.

101 ms - Dördüncü yineleme: kod 22 ms içinde tamamlandı.

Ve benzeri.

Bir Görev kullanmalı ve tamamlandı mı kontrol etmeliyim? Bunun adil ve zarif bir yolu nedir? Herhangi bir yardım çok takdir edilecektir. Teşekkürler. https://dotnetfiddle.net/cqmTzF

+1

var birkaç denemeden sonra , bu kod örneği kod ile iş gibi görünüyor, üretim kodu ile sonradan görmenizi sağlar: Düzenleme

bir şey denedin mi? Eğer öyleyse, örnek var mı? –

+0

Evet, biraz daha denedim ve görünüşe göre bir çalışma çözümü var. Soruyu düzenledim. –

cevap

1

böyle bir şey deneyin:

public class PeriodicAction 
    { 
     private int _frequencyMs; 
     private readonly Timer _timer; 
     private bool _enabled; 

     public Action ActionMethod { get; private set; } 

     public int FrequencyMs 
     { 
      get { return _frequencyMs; } 
      set 
      { 
       _frequencyMs = value; 
       _timer.Change(0, _frequencyMs); 
      } 
     } 

     public bool Enabled 
     { 
      get { return _enabled; } 
      set 
      { 
       _timer.Change(value ? 0 : Timeout.Infinite, _frequencyMs); 
       _enabled = value; 
      } 
     } 

     public bool IsRunning { get; private set; } 

     public PeriodicAction(Action actionMethod, int frequencyMs) 
     { 
      this.ActionMethod = actionMethod; 
      this._frequencyMs = frequencyMs; 
      this._timer = new Timer(timerCallbackMethod, null, 0, frequencyMs); 
     } 

     private void timerCallbackMethod(object sender) 
     { 
      if (IsRunning) return; 

      IsRunning = true; 

      ActionMethod(); 
      _timer.Change(0, _frequencyMs); 

      IsRunning = false; 
     } 
    } 
+0

Cevabınız için teşekkürler, kodumu uygulamaya koymam için bana yardımcı oldu. –

İlgili konular