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 (?)
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.
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();
}
// ...
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; }
}