1

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

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

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();
    }
}

这样的事情可能吗?如果没有,有没有更好的方法来做到这一点?

4

2 回答 2

7

这个怎么样:

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并等待它完成,然后重复循环的效果。

于 2013-06-13T18:13:03.830 回答
5

我相信@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如果您希望以不同的方式处理此问题,您可以捕捉到。

于 2013-06-13T18:12:41.380 回答