2014-01-12 3 views
8

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

Поскольку я новичок в .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 
    } 

против

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

где вы начинаете TaskTimer? –

ответ

5

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

  1. Task.Delay подход задержит определенное количество времени между циклов, в то время как DispatcherTimer подход начнет новый цикла на указанное время цикла.
  2. Task.Delay более портативный, поскольку он не зависит от типа, привязанного к конкретному пользовательскому интерфейсу.
+0

Мне не очень нравится время. Мне только все равно, что он может повторять и исполнять. Насколько я знаю, оба создания фоновых потоков добавляют повышение обратного вызова событий во время подхода. Разве они одинаковы? – Sakura

+0

Производительность сопоставима. Ни один из них не создает фоновые потоки. –

+0

@StephenCleary: правильно ли использовать ConfigureAwait (false), если мы не хотим делать что-то в потоке пользовательского интерфейса? – Dunken

0

Вы также можете использовать await с DispatcherTimer, тогда вы можете измерить производительность для себя. Пример:

async void TaskTimer() 
{ 
    DispatcherTimer timer = new DispatcherTimer(); 
    TaskCompletionSource<bool> tcs; 
    EventHandler tickHandler = (s, e) => 
     tcs.TrySetResult(true); 

    timer.Interval = TimeSpan.FromSeconds(5000); 
    timer.Tick += tickHandler; 
    timer.Start(); 

    while (true) 
    { 
     tcs = new TaskCompletionSource<bool>(); 
     await tcs.Task; 
     // Do stuff upon next tick 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^