C# 等待延迟或使用计时器
我很难理解这一点 我需要执行几个方法,每个方法都会延迟一段时间。所以从我所能读到的,我可以使用Task.Delay或者一个计时器,就像它内部看起来的那样,Task.Delay就是使用计时器 那么,以下两种方法是否等效?如果不是,每种方法的优缺点是什么 每种方法的调用线程会发生什么情况?我真的不想阻止线程。但我认为这两种方法都不行 第一次进近:C# 等待延迟或使用计时器,c#,.net-core,C#,.net Core,我很难理解这一点 我需要执行几个方法,每个方法都会延迟一段时间。所以从我所能读到的,我可以使用Task.Delay或者一个计时器,就像它内部看起来的那样,Task.Delay就是使用计时器 那么,以下两种方法是否等效?如果不是,每种方法的优缺点是什么 每种方法的调用线程会发生什么情况?我真的不想阻止线程。但我认为这两种方法都不行 第一次进近: public async Task SimulateScenarioAsync() { await Task.Delay(1000).Config
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
}
第二次进近:
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
}
问题是建议像这样把它包装在一个电话里
async Task MyTaskWithDelay()
{
await Task.Delay(1000);
MyTask();
}
比较两种方法
答案是
有两个主要区别:
Task.Delay
方法将在两个周期之间延迟指定的时间量,而dispatchermer
方法将在指定的周期时间开始新的周期Task.Delay
更易于移植,因为它不依赖于绑定到特定UI的类型async Task MyTaskWithDelay()
{
await Task.Delay(1000);
MyTask();
}
比较两种方法
答案是
有两个主要区别:
Task.Delay
方法将在两个周期之间延迟指定的时间量,而dispatchermer
方法将在指定的周期时间开始新的周期Task.Delay
更易于移植,因为它不依赖于绑定到特定UI的类型Task.Delay将在指定的时间内阻塞线程。Dispatchermer为计时器创建一个单独的线程,然后在指定的时间后返回到原始线程。我认为第一种方法更具可读性
除此之外,我看不出有任何理由选择这两种方法。如果您在两次操作之间等待1秒,那么该命令的性能实际上并不重要,因为它至少比您的等待时间快1000倍。我认为第一种方法更具可读性
除此之外,我看不出有任何理由选择这两种方法。如果您在两次操作之间等待1秒,则该命令的性能并不重要,因为它至少比您的等待时间快1000倍。如果您已经在使用TPL,我会选择
Task.Delay()
是的,而延迟方法也在使用它。第一种方法假设任务是按顺序执行的,其间存在延迟。通常,使用计时器将允许任务完全独立地执行。你的问题不清楚任务之间是否存在隐式依赖,但如果存在,你可能应该使用第一种方法。如果任务的执行时间是不平凡的,那么您也必须考虑是否应该考虑缩短延迟。计时器可以更好地处理这个问题。正如您所看到的,第一种方法更干净,并且清楚地表达了您的意图,所以请使用它。至于线程,没有什么不寻常的事情发生。当延迟结束时-从线程池抓取线程并在其上执行continuation。对于基于意见的标记,我不同意,因为我还要求提供线程等的详细信息。这两种方法在技术上是等价的。但回答这个问题是问题的一部分。。。这不是基于意见的。如果您已经在使用TPL,我会选择Task.Delay()
是的,延迟方法也在使用它。您的第一种方法假设任务是按顺序执行的,其间有延迟。通常,使用计时器将允许任务完全独立地执行。你的问题不清楚任务之间是否存在隐式依赖,但如果存在,你可能应该使用第一种方法。如果任务的执行时间是不平凡的,那么您也必须考虑是否应该考虑缩短延迟。计时器可以更好地处理这个问题。正如您所看到的,第一种方法更干净,并且清楚地表达了您的意图,所以请使用它。至于线程,没有什么不寻常的事情发生。当延迟结束时-从线程池抓取线程并在其上执行continuation。对于基于意见的标记,我不同意,因为我还要求提供线程等的详细信息。这两种方法在技术上是等价的。但回答这个问题是问题的一部分。。。这不是基于观点的。这是一个好的开始,但我想解释一下为什么一个比另一个好。这篇文章说“这是惊人的错误!”!这是一个好的开始,但我想解释一下为什么一个比另一个好。这篇文章说“这是惊人的错误!”!