Могу ли я использовать Task.Задержка как таймер?
Я хочу выполнять некоторый код каждую секунду. Код, который я использую сейчас:
задач.Run ((Action)ExecuteSomething);
и ExecuteSomething()
определяется следующим образом:
private void ExecuteSomething()
{
Task.Delay(1000).ContinueWith(
t =>
{
//Do something.
ExecuteSomething();
});
}
этот метод блокирует поток? Или я должен использовать Timer
класс В C#? И кажется таймер также выделяет отдельный поток для выполнения (?)
3 ответов
реактивный фреймворк Microsoft идеально подходит для этого. Просто Система "NuGet".Реактивный", чтобы получить биты. Тогда вы можете сделать следующее:
IDisposable subscription =
Observable
.Interval(TimeSpan.FromSeconds(1.0))
.Subscribe(x => execute());
когда вы хотите остановить подписку, просто позвоните subscription.Dispose()
. Кроме того, реактивная структура может предложить гораздо больше мощности, чем задачи или основные таймеры.
Task.Delay
использует Timer
внутри
С Task.Delay
вы можете сделать свой код немного яснее, чем с Timer
. И используя async-await
не будет блокировать текущий поток (обычно UI).
public async Task ExecuteEverySecond(Action execute)
{
while(true)
{
execute();
await Task.Delay(1000);
}
}
в исходном коде: задач.Задержка
// 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; }
}