我从那里我正在使用下面的代码API调用一个C#Windows应用程序:
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;
}
}
通常发生的事情是当过有一些网络发出GET请求的API被取消。所以我所做的是每当任务就是让取消了,我尝试它的三倍。如果它不工作,那么我抛出一个异常调用方法。如果它是成功的,在这3次尝试,我打破循环。
现在,当我在我的代码运行声纳分析,它显示删除break语句和重构code.Can谁能帮助我在这里。我无法弄清楚如何重构它。
任何帮助或暗示的高度赞赏。非常感谢!
while (true)
是一个无限循环。相反,我宁愿用(布尔)变量while()
检查。这让你有机会使用这个变量来false
,避免break
。
你不应该一般采用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;
}
}
创建一个布尔变量称为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
}
...
}
如果你不与波莉去,我会建议的@扫乐和@Magnus'答复组合:
const int retryLimit = 3;
boolean success = false;
int retryCounter = 0;
while (!success
&& retryCounter++ < retryLimit) {
try
{
// http request as is
success = true;
}
// Exception handling
}
这样,您控制重试次数和跳出循环的时候请求成功。