2017-02-14 77 views
7

Her saniyede bir kod yürütmek istiyorum. Şu anda kullanıyorum kod:Task.Delay'ı bir zamanlayıcı olarak kullanabilir miyim?

Task.Run ((Eylem) ExecuteSomething); Bu yöntem, bir iş parçacığı engelleyen mu

private void ExecuteSomething() 
     { 
      Task.Delay(1000).ContinueWith(
       t => 
       { 
        //Do something. 

        ExecuteSomething(); 
       }); 
     } 

:

Ve ExecuteSomething() aşağıdaki gibi tanımlanır? Yoksa C# Timer sınıfını kullanmalı mıyım? Ve bu Timer also dedicates a separate thread for execution görünüyor (?)

+1

"Ayrı iş parçacığı" ile ilgili olarak, tüm zamanlayıcılar arasında paylaşılan yalnızca bir iş parçacığı vardır. –

cevap

5

Microsoft'un Reaktif Çerçeve bunun için idealdir. Sadece NuGet "System.Reactive" bitleri almak için. Sonra bunu yapabilirsiniz: aboneliğin durdurmak istediğinizde sadece subscription.Dispose() çağrı

IDisposable subscription = 
    Observable 
     .Interval(TimeSpan.FromSeconds(1.0)) 
     .Subscribe(x => execute()); 

. Bunun üzerine Reaktif Çerçeve, Görevlerden veya temel Zamanlayıcılardan çok daha fazla güç sağlayabilir.

+1

Benim durumumda Rx kullanıyorum Task.Delay kullanarak herhangi bir özel avantaj var mı? Sadece bilmek istediğin, sadece bu amaçla paketi dahil etmeye değer. Yine de oy verildi. – Sharun

+0

@Sharun - Rx, LINQ ve daha sonra bazı kadar güce sahiptir. Açıkladığınız şeyden daha fazlasına ihtiyacınız yok, ama Rx'in sunduğu şeyden gerçekten faydalandığından şüpheleniyorum. Ne yapmaya çalıştığın hakkında daha fazlasını tarif edebilir misin? – Enigmativity

9

Task.Delay içten

Task.Delay ile Timer ile sonra biraz ihalesiz net kodunuzu yapabilirsiniz Timer kullanır. Ve async-await kullanmak, geçerli parçayı engellemez (genellikle UI). Kaynak kodu itibaren

public async Task ExecuteEverySecond(Action execute) 
{ 
    while(true) 
    { 
     execute(); 
     await Task.Delay(1000); 
    } 
} 

: Task.Delay

// on line 5893 
// ... and create our timer and make sure that it stays rooted. 
if (millisecondsDelay != Timeout.Infinite) // no need to create the timer if it's an infinite timeout 
{ 
    promise.Timer = new Timer(state => ((DelayPromise)state).Complete(), promise, millisecondsDelay, Timeout.Infinite); 
    promise.Timer.KeepRootedWhileScheduled(); 
} 

// ...