C# 等待延迟或使用计时器

C# 等待延迟或使用计时器,c#,.net-core,C#,.net Core,我很难理解这一点 我需要执行几个方法,每个方法都会延迟一段时间。所以从我所能读到的,我可以使用Task.Delay或者一个计时器,就像它内部看起来的那样,Task.Delay就是使用计时器 那么,以下两种方法是否等效?如果不是,每种方法的优缺点是什么 每种方法的调用线程会发生什么情况?我真的不想阻止线程。但我认为这两种方法都不行 第一次进近: public async Task SimulateScenarioAsync() { await Task.Delay(1000).Config

我很难理解这一点

我需要执行几个方法,每个方法都会延迟一段时间。所以从我所能读到的,我可以使用Task.Delay或者一个计时器,就像它内部看起来的那样,Task.Delay就是使用计时器

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

每种方法的调用线程会发生什么情况?我真的不想阻止线程。但我认为这两种方法都不行

第一次进近

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的类型
  • 波斯特说

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

    问题建议将其包装在一个调用中,如下所示

    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。对于基于意见的标记,我不同意,因为我还要求提供线程等的详细信息。这两种方法在技术上是等价的。但回答这个问题是问题的一部分。。。这不是基于观点的。这是一个好的开始,但我想解释一下为什么一个比另一个好。这篇文章说“这是惊人的错误!”!这是一个好的开始,但我想解释一下为什么一个比另一个好。这篇文章说“这是惊人的错误!”!