2012-10-11 10 views
6

Her 1 saniyede bir işlev çalıştırmak istiyorum, 10 saniye sonra 10 kez çalıştırılır. en basit yaklaşım böyle bir döngü kullanıyor:uyku-kadar C#

while(true) 
{ 
Thread.Sleep(1000); 
function(); 
} 

Ancak bu yaklaşım ile temel sorun, herhangi periyodik teminat vermez olmasıdır. Böyle olacak) işlevini (çalıştırmak için fonksiyonun infaz süresini 0.1 saniye sürer eğer Yani: 0, 1.1, 2.2, 3.3, 4.4, ...

Gerçek zamanlı dilinde, Hatırlayacağınız gibi

ADA (#time) 'a kadar bir fonksiyonumuz var. Şimdi C# 'da bir alternatif arıyorum.

Örnek kodlar atanacaktır.

+2

Küçük örneklerde uyuyun ve kodunuzu çalıştırmadan önce bir saniyenin geçip geçmediğini kontrol edin. – VVS

+0

Eğer işlev() yürütmek için 1 saniyeden uzun sürerse, ne yapmak istersiniz? –

+0

C# gerçek zamanlı bir dil değil. onun, hatta başka bir iş parçacığı/süreç olabileceğinden, iş parçacığının, 1 saniye sonra tam olarak çalışacağını bile garanti etmedi. Bu kadar hassas olmanız gerekiyorsa, belki başka araçlar kullanmalısınız? – YavgenyP

cevap

4
System.Threading.Timer timer = new System.Threading.Timer(ThreadFunc, null, 0, 1000); 

private static void ThreadFunc(object state) 
{ 
    //Do work in here. 
} 

fazla bilgi için MSDN bakınız olduğunu.

+0

Harika, aradığım şey bu. çok teşekkürler – user1654052

+0

Yardım için sevindim. Cevap olarak işaretlemeyi unutmayın. –

+0

2 dakika sonra bunu yapacağım (2 dakikanın ardından bir cevabı kabul edebilirsiniz) – user1654052

1

Belirli bir zaman aralığından sonra bir şeyi çağırmak için Timer sınıfını kullanmalısınız. İşte Tutorial

+0

Çok teşekkürler. Bu gerçekten yararlı oldu :) – user1654052

3

Saati ölçmek için Stopwatch kullanabilirsiniz. Bunun yerine bir For-Loop kullanırdım.

var sw = new System.Diagnostics.Stopwatch(); 
var timeForOne = TimeSpan.FromSeconds(1); 
var count = 10; 
for(int i = 0; i < count; i++) 
{ 
    sw.Restart(); 
    function(); 
    sw.Stop(); 
    int rest = (timeForOne - sw.Elapsed).Milliseconds; 
    if (rest > 0) 
     System.Threading.Thread.Sleep(rest); 
} 
+0

Harika, ama yine de sonuncu bloğu düşünüyorum, dinlenme ve uyku fonksiyonu çağrısının hesaplanması bazen tükenir ve bir öncekine göre herhangi bir avantaj göremez! ! Bu bir alternatif ama diğeri daha basit görünüyor :) – user1654052

+0

@ user1654052: Aslında ne 'TimeSpan ne kabul edilemez.Çıkar '+ '(dinlenme> 0)' tüketirse, kesinlikle ihmal edilebilir ve 1 milisaniyeden azdır. –

+0

sadece onun değil. dikkatlice bir göz atın. int rest = blah; eğer (dinlenme> 0)] hepsi zaman ve görev sırasını düşünmeden yürütülür :) Biliyorum ki göz ardı edilebilir gibi görünüyor ama eğer bir yıl boyunca çalıştırılacaksa, fonksiyonun her saniyede idam edileceğini garanti edemezsin. bu yüzden kabul edilebilir bir cevap olduğunu düşünmüyorum. – user1654052