如何重构代码以删除c#应用程序中的break语句
我有一个c#windows应用程序,我在其中使用以下代码调用API:如何重构代码以删除c#应用程序中的break语句,c#,sonarqube,break,C#,Sonarqube,Break,我有一个c#windows应用程序,我在其中使用以下代码调用API: while (true) { try { using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "Some URL")) { requestMessage.Headers.Add("Accept", "application/json");
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次尝试中成功,我就打破了循环
现在,当我对我的代码运行sonar分析时,它显示了如何删除break语句并重构代码。这里有人能帮我吗。我不知道如何重构它
非常感谢您的任何帮助或提示。非常感谢 而(true)
是一个无限循环。
相反,我宁愿使用(布尔)变量签入while()
。
这使您有机会将此变量设置为
false
,并避免break
您通常不应该使用,而(true)
(这是一个潜在的无限循环),即使您在某个地方有一个break
语句,有时也可能达不到该语句
我建议对循环使用:
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;
}
}
for(int i=0;i<3;i++)
{
尝试
{
使用(HttpRequestMessage requestMessage=newHttpRequestMessage(HttpMethod.Get,“某些URL”))
{
添加(“接受”、“应用程序/json”);
response=wait myHttpHelper.SendHttpRequest(requestMessage).ConfigureWait(false);
}
}
捕获(TaskCanceledException)
{
睡眠(10000);
}
捕获(异常ex2)
{
投
}
}
创建一个名为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
}
...
}
boolean success=false;
而(!成功){
尝试
{
使用(HttpRequestMessage requestMessage=newHttpRequestMessage(HttpMethod.Get,“某些URL”))
{
添加(“接受”、“应用程序/json”);
response=wait myHttpHelper.SendHttpRequest(requestMessage).ConfigureWait(false);
}
success=true;如果你不支持波利,我建议你结合使用@Sweeper和@Magnus的回复:
const int retryLimit = 3;
boolean success = false;
int retryCounter = 0;
while (!success
&& retryCounter++ < retryLimit) {
try
{
// http request as is
success = true;
}
// Exception handling
}
const int retryLimit=3;
布尔成功=假;
int-retryCounter=0;
而(!成功
&&retryCounter++
通过这种方式,您可以控制重试次数,并在请求成功时跳出循环。也许可以尝试在while循环中使用attemptCount?我建议您尝试使用。这比自己手动设置重试案例容易得多。这会发送消息3次吗?@Magnus是的,会,但我认为这会有所不同nt关于全面改进代码的问题