任务重复?

时间:2013-06-13 18:00:03

标签: c# multithreading task async-await

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

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

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

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

2 个答案:

答案 0 :(得分: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并等待它完成在重复循环之前。

答案 1 :(得分:5)

我相信@CodingGorilla有正确的想法。您的代码应如下所示(使用CancellationToken s进行超时):

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