C# - 如果if-statement为true,请尝试两次

时间:2016-12-07 22:11:56

标签: c#

我有一个解析网站的代码并将一些值添加到列表中。有时我需要解析网站两次并将第二个解析值添加到同一个列表中。

这是一些代码:

public async Task<IEnumerable<Info>>....
{
var values = new List<Info>();
var request = something;
var request_rewritten = rewritten request to run the second time;
......
if request contains something do all the under two times. Both for the request and the rewritten request and add it to result. 
......
var response = await RequestBytes(request);
var results = Encoding.GetEncoding("iso-8859-1").GetString(response.Content);
_fDom = results;

   try
   {
   do something and a lot of code
   ......
   values.Add(result);
   return result
   }
}

如果请求中包含我需要的内容,请尝试第二次尝试。原始请求和重写请求都添加到结果中。可以这样做吗?

3 个答案:

答案 0 :(得分:3)

您可以遵循此模式。在方法中添加一个额外的参数,指示剩余的重试次数。

void DoSomething(arg1, arg2, int retriesRemaining = 0)
{
    try
    {
        DoWork();
    }
    catch
    {
        if (retriesRemaining) DoSomething(arg1, arg2, --retriesRemaining);
    }
}

答案 1 :(得分:0)

我想如果你想避免编写一个方法(这是你问题的最佳答案),你可以使用一个标志:

bool bRunAgain = true;

while (bRunAgain)
{
   // Your logic, check result and see if you need to run it again

   if (your condition to run again == false)
   {
      bRunAgain = false;
   }
}

答案 2 :(得分:0)

这是一个常见的解决方案。将操作传递给此方法并指定重试次数

public bool ExecuteWithRetry(Action doWork, int maxTries=1) {
   for(var tryCount=1; tryCount<=maxTries; tryCount++){
      try{
         doWork();
      } catch(Exception ex){
         if(tryCount==MaxTriex){
            Console.WriteLine("Oops, no luck with DoWork()");
            return false;
         }
      }
      return true;
   }
}

所以在你的方法中

void Something(){
  ....
  if(ExecuteWithRetry(()=>NotTrustyMethod(), 2)) {
     //success
  } else {
     //fail
  }


}

void NotTrustyMethod(){ ...}

此解决方案可用于任何需要重试任何类型参数(或没有参数)方法的情况