如何运行任务N次,直到成功为止?

时间:2014-08-19 00:55:21

标签: c# task-parallel-library task

使用ContinueWith函数使用C#的TaskFactory。我正试图解决这个问题

  • 执行Foo()。
  • 如果结果成功,请退出
  • 如果Foo()没有成功,那么迭代并执行Foo()直到它成功(最大迭代次数3)
  • 如果在3次迭代中没有成功,请放弃

我开始的代码看起来像这样

var executeTask = Task.Factory.StartNew<ExecutionStatus>(() =>
        {
            return Foo();
        });
        executeTask.ContinueWith(task => CheckIfExecutionWasSuccessful(task)).
                        ContinueWith(task => CheckIfExecutionWasSuccessful(task)).
                        ContinueWith(task => CheckIfExecutionWasSuccessful(task)).
                        ContinueWith(task => CheckLastTimeBeforeGivingUp(task));

Foo()和CheckIfExecutionWasSuccessful()看起来像这样

ExecutionStatus Foo(){
      //Do my work
      return new ExecutionStatus(){Succeded = true}
     }

ExecutionStatus CheckIfExecutionWasSuccessful(Task<ExecutionStatus> task){
            if(task.Result.Succeeded) return task.Result;
            else return Foo()

有些东西告诉我,这不是解决这个问题的最好方法。有什么建议,想法吗?

2 个答案:

答案 0 :(得分:3)

我不明白为什么要使用多个TaskContinueWith()使这更复杂。相反,编写代码就像没有Task然后Task中运行它一样:

Task.Factory.StartNew(() =>
{
    for (int i = 0; i < maxTries - 1; i++)
    {
        try
        {
            return Foo();
        }
        catch
        { }
    }

    return Foo();
});

这使代码更清晰,更明显更正确,更容易修改。

答案 1 :(得分:0)

简单:

var MaxTries = 3;
var executeTask = Task.Factory.StartNew<ExecutionStatus>(() => Foo());

for(var i = 0; i < MaxTries; i++)
{
    executeTask = executeTask.ContinueWith(task => CheckIfExecutionWasSuccessful(task));
}

executeTask = executeTask.ContinueWith(task => CheckLastTimeBeforeGivingUp(task));