Могу ли я использовать 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; }
}