Task.Delay против DispatcherTimer?

Я рассматриваю возможность использования Task.Delay() для непрерывного таймера, потому что это более просто и читабельно.

Поскольку я новичок в .NET, я не вижу существенной разницы между этими двумя кодами. Можете ли вы показать мне разницу (если она есть) между ними?

// Create variable at some place
DispatcherTimer timer = new DispatcherTimer();

timer.Interval = TimeSpan.FromSeconds(5);
timer.Tick += timer_Elapsed;
timer.Start();

// Function other place
void timer_Elapsed(object sender, EventArgs e)
{
    //Do stuff
    }

vs

// Every thing inside a function
async void TaskTimer()
{
    while (true)
    {
        await Task.Delay(5000);
        // Do stuff
    }
}

person Tuyen Pham    schedule 12.01.2014    source источник
comment
где вы запускаете TaskTimer?   -  person Simon_Weaver    schedule 23.01.2017


Ответы (1)


Есть два основных отличия:

  1. Подход Task.Delay задержит заданное количество времени между циклами, а подход DispatcherTimer запустит новый цикл в указанное время цикла.
  2. Task.Delay более переносим, ​​поскольку он не зависит от типа, привязанного к конкретному пользовательскому интерфейсу.
person Stephen Cleary    schedule 12.01.2014
comment
Меня не очень волнует время. Меня волнует только его повторение и производительность. Насколько я знаю, оба создают фоновые потоки и добавляют обратный вызов события при приближении времени. У них одинаковая производительность? - person Tuyen Pham; 12.01.2014
comment
Производительность сопоставима. Ни один из них не создает фоновые потоки. - person Stephen Cleary; 12.01.2014
comment
@StephenCleary: правильно ли использовать ConfigureAwait (false), если мы не хотим что-то делать в потоке пользовательского интерфейса? - person Dunken; 12.11.2014
comment
@Dunken: Да, вы должны использовать ConfigureAwait(false) для каждого await в методе, который не требует определенного контекста (например, контекст пользовательского интерфейса). - person Stephen Cleary; 12.11.2014