【问题标题】:Task repeating?任务重复?
【发布时间】:2013-06-13 18:00:03
【问题描述】:

以前,当创建一个循环任务时,它会在第一次完美运行并由于时间问题而崩溃,例如一个单独任务的功能会比另一个任务开始运行得更快,即使它被编程为在此之前运行任务。

所以我的想法是想办法在延迟(时间)结束后重复任务的事件,在我的脑海中它会是这样的:

private async Task programCore()
{
    int n = 1000;
    for (int i = 0; i < n; )
    {
         FirstThing(); 
         await Task.Delay(2100);

         SecondThing();
         await Task.Delay(2200);

         ThirdThing();
         await Task.Delay(2300);
    }
////////////////////////////////////////////////////////////////////////////

    else if (programCore.TasksHaveAllTimedOut) // Idealistic code.
    {
        programCore.Restart();
    }
}

这样的事情可能吗?如果没有,有更好的方法吗?

【问题讨论】:

  • 如果您等待的时间超过 2100 毫秒怎么办?
  • 它没有。 2100ms 可以考虑超出它需要的时间。
  • 对我来说听起来很狡猾。你还在等什么?
  • 这是一个糟糕的假设。为什么不直接制作FirstThing() 等,asyncawait 那些?
  • @CodingGorilla ,你是什么意思?我对 C# 还很陌生。

标签: c# multithreading task async-await


【解决方案1】:

这个怎么样:

private async Task programCore()
{
    int n = 1000;
    for (int i = 0; i < n; )
    {
        await FirstThing(); 
        await SecondThing();
        await ThirdThing();
   }
}

private async Task FirstThing()
{
    // Do something here
}

private async Task SecondThing()
{
    // Do something here
}

private async Task ThirdThing()
{
    // Do something here
}

它的效果是它运行FirstThing,等待它完成,然后运行SecondThing,等待它完成,最后运行ThirdThing并等待它完成,然后重复循环。

【讨论】:

  • 请将其标记为“答案”
【解决方案2】:

我相信@CodingGorilla 的想法是正确的。您的代码应如下所示(使用CancellationTokens 表示超时):

private async Task programCore()
{
  int n = 1000;
  for (int i = 0; i < n; ++i)
  {
    var timeout1 = new CancellationTokenSource(2100);
    await FirstThingAsync(timeout1.Token);

    var timeout2 = new CancellationTokenSource(2200);
    await SecondThingAsync(timeout2.Token);

    var timeout2 = new CancellationTokenSource(2300);
    await ThirdThingAsync(timeout3.Token);
  }
}

如果任何任务超过其超时时间,上面的代码将引发异常,这可能不是您想要的。如果您想以不同的方式处理此问题,可以使用 OperationCanceledException

【讨论】:

  • 如果他需要能够取消或允许任务“超时”,这很好。我认为 OP 只是在使用延迟来等待其他任务完成。
  • @CodingGorilla:我重读了这个问题,我相信你是对的; OP 不需要超时。 +1 给你!
猜你喜欢
  • 1970-01-01
  • 2011-01-31
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
相关资源
最近更新 更多