我有一个C#Windows应用程序,使用以下代码在其中调用API:
while (true)
{
try
{
using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "Some URL"))
{
requestMessage.Headers.Add("Accept", "application/json");
response = await myHttpHelper.SendHttpRequest(requestMessage).ConfigureAwait(false);
}
break; // where the code smells is shown
}
catch (TaskCanceledException )
{
if (++attemptCount > 3)
{
throw;
}
Thread.Sleep(10000);
}
catch (Exception ex2)
{
throw;
}
}
通常,发生网络问题时,会取消对API的get请求。所以我要做的是,每当任务被取消时,我都会尝试三次。如果它不起作用,则将调用方法抛出异常。如果在这3次尝试中都成功,那么我将打破循环。
现在,当我对代码运行声纳分析时,它显示要删除break语句并重构代码。任何人都可以在这里帮助我。我不知道如何重构它。
任何帮助或提示都将受到高度赞赏。非常感谢!
答案 0 :(得分:1)
while (true)
是一个无限循环。
相反,我宁愿使用(布尔)变量来检入while()
。
这样您就有机会将此变量设置为false
并避免使用break
。
答案 1 :(得分:0)
您通常不应该使用while (true)
(这是一个潜在的无限循环),即使您在某处有break
语句,有时也可能会发生无法到达该语句的情况。
我建议您使用for
循环:
for (int i = 0; i < 3; i++)
{
try
{
using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "Some URL"))
{
requestMessage.Headers.Add("Accept", "application/json");
response = await myHttpHelper.SendHttpRequest(requestMessage).ConfigureAwait(false);
}
}
catch (TaskCanceledException)
{
Thread.Sleep(10000);
}
catch (Exception ex2)
{
throw;
}
}
答案 2 :(得分:0)
创建一个名为success
的布尔变量,并将其用作while循环条件:
boolean success = false;
while (!success) {
try
{
using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "Some URL"))
{
requestMessage.Headers.Add("Accept", "application/json");
response = await myHttpHelper.SendHttpRequest(requestMessage).ConfigureAwait(false);
}
success = true; <--- set to true here
}
...
}
答案 3 :(得分:0)
如果您不喜欢Polly,我建议同时使用@Sweeper和@Magnus的回复:
MyObject newest = Collections.max(myObjectList, Comparator.comparing(LocalDate.parse(MyObject::getDate)));
这样,您可以控制重试次数,并且在请求成功时跳出循环。