2017-06-15 74 views
0

我很难得到我的头。等待延迟或使用计时器

我需要执行一些方法,每个方法都会延迟一段时间。因此,从我可以读取的内容来看,我可以使用Task.Delay或Timer,因为它看起来在内部,Task.Delay正在使用Timer。

那么以下两种方法是否相等?如果不是,每种方法的优缺点是什么?

每种方法的调用线程会发生什么?我真的不想阻止线程。我不认为这两种方法中的任何一种都可以。

1的方法

public async Task SimulateScenarioAsync() 
{ 
    await Task.Delay(1000).ConfigureAwait(false); 
    await FooAsync.ConfigureAwait(false); 

    await Task.Delay(2000).ConfigureAwait(false); 
    await BarAsync.ConfigureAwait(false); 

    await Task.Delay(500).ConfigureAwait(false); 
    await StuffAsync.ConfigureAwait(false); 
} 

第二个方法

public void SimulateScenario() 
{ 
    var timer = new Timer(new TimerCallback(FooAsync), null, 1000, Timeout.Infinite); 
} 

public void FooAsync(Object obj) 
{ 
    // do some stuff 
    var timer = new Timer(new TimerCallback(BarAsync), null, 2000, Timeout.Infinite); 
} 

public void BarAsync(Object obj) 
{ 
    // do some stuff 
    var timer = new Timer(new TimerCallback(StuffAsync), null, 500, Timeout.Infinite); 
} 

public void StuffAsync(Object obj) 
{ 
    // do some stuff 
} 
+2

如果您已经使用TPL,我会选择'Task.Delay()' –

+0

是的,延迟方法也使用它。 – dyesdyes

+0

您的第一种方法假定任务按照顺序执行,并在两者之间延迟。一般来说,使用定时器将允许任务完全独立执行。从你的问题中不清楚你的任务之间是否存在隐式依赖关系,但是如果你有可能应该使用第一种方法。如果任务的执行时间不平凡,您还必须考虑是否应该考虑缩短延迟的时间。定时器可以更好地处理这个问题。 –

回答

1

我认为第一种方法更具可读性。

除此之外,我看不出选择任何方法的任何理由。如果您在两次操作之间等待1秒,那么命令的性能无关紧要,因为它肯定会比等待时间快至少1000倍。

0

This问题表明它包裹在一个呼叫这样

async Task MyTaskWithDelay() 
{ 
    await Task.Delay(1000); 
    MyTask(); 
} 

有限公司mparing两种方法

This回答说

主要有两大区别:

  1. Task.Delay办法将推迟周期之间在指定的时间量,而DispatcherTimer方法将启动指定循环时间的新周期。
  2. Task.Delay更具可移植性,因为它不依赖于绑定到特定UI的类型。

而且this发帖称

的Task.Delay会阻塞线程在指定的时间。 DispatcherTimer为计时器创建一个单独的线程,然后在指定的时间后返回到原始线程。

+0

这是一个好的开始,但我想解释一下为什么比另一个更好。线程会发生什么 – dyesdyes