我有一个解析网站的代码并将一些值添加到列表中。有时我需要解析网站两次并将第二个解析值添加到同一个列表中。
这是一些代码:
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
}
}
如果请求中包含我需要的内容,请尝试第二次尝试。原始请求和重写请求都添加到结果中。可以这样做吗?
答案 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(){ ...}
此解决方案可用于任何需要重试任何类型参数(或没有参数)方法的情况