wake-up-neo.net

Kann ich Task.Delay als Timer verwenden?

Ich möchte in jeder Sekunde Code ausführen. Der Code, den ich jetzt benutze, ist:

Task.Run ((Action) ExecuteSomething);

UndExecuteSomething()ist wie folgt definiert:

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

                   ExecuteSomething();
               });
        }

Blockiert diese Methode einen Thread? Oder sollte ich die Klasse Timer in C # verwenden? Und es scheint, Timer widmet auch einen separaten Thread für die Ausführung (?)

11
Sharun

Das Reactive Framework von Microsoft ist dafür ideal. Nur NuGet "System.Reactive", um die Bits zu erhalten. Dann können Sie das tun:

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

Wenn Sie das Abonnement beenden möchten, rufen Sie einfach subscription.Dispose() auf. Darüber hinaus bietet das Reactive Framework weit mehr Leistung als Aufgaben oder einfache Timer.

4
Enigmativity

Task.Delay verwendet intern Timer

Mit Task.Delay können Sie Ihren Code etwas klarer machen als mit Timer. Die Verwendung von async-await blockiert den aktuellen Thread nicht (normalerweise in der Benutzeroberfläche).

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

Aus dem 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();
}

// ...
14
Fabio
static class Helper
{
    public async static Task ExecuteInterval(Action execute, int millisecond, IWorker worker)
    {
        while (worker.Worked)
        {
            execute();

            await Task.Delay(millisecond);
        }
    }
}


interface IWorker
{
    bool Worked { get; }
}
0
nim