2017-02-14 4 views
7

Ich möchte etwas Code pro Sekunde ausführen. Der Code, den ich jetzt verwende, ist:Kann ich Task.Delay als Timer verwenden?

Task.Run ((Aktion) ExecuteSomething);

Und ExecuteSomething() wird wie folgt definiert:

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

        ExecuteSomething(); 
       }); 
     } 

blockiert diese Methode einen Thread? Oder sollte ich Timer Klasse in C# verwenden? Und es scheint, Timer also dedicates a separate thread for execution (?)

+1

In Bezug auf den "separaten Thread" gibt es nur einen Thread, der von allen Timern gemeinsam genutzt wird. –

Antwort

5

Microsofts Reactive Framework ist für diese ideal. Just NuGet "System.Reactive", um die Bits zu bekommen. Dann können Sie dies tun:

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

Wenn Sie das Abonnement nur subscription.Dispose() rufen beenden möchten. Darüber hinaus bietet das Reactive Framework weitaus mehr Leistung als Tasks oder einfache Timer.

+1

Hat die Verwendung von Rx in meinem Fall spezielle Vorteile als die Verwendung von Task.Delay? Will nur wissen, ist es wert, das Paket nur für diesen Zweck zu integrieren. Upoted trotzdem. – Sharun

+0

@Sharun - Rx hat so viel Macht wie LINQ und dann einige. Von dem, was Sie beschrieben haben, gibt es nichts mehr, was Sie brauchen, aber ich vermute, dass Sie tatsächlich davon profitieren würden, was Rx bietet. Kannst du mehr darüber beschreiben, was du versuchst? – Enigmativity

9

Task.Delay verwendet Timer intern

Mit Task.Delay Sie können Ihren Code ein wenig bieten klarer dann mit Timer machen. Und die Verwendung von async-await wird den aktuellen Thread (UI normalerweise) nicht blockieren.

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

Von Quellcode: 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(); 
} 

// ... 
Verwandte Themen