如何重构代码以删除c#应用程序中的break语句

如何重构代码以删除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");

我有一个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次尝试中成功,我就打破了循环

现在,当我对我的代码运行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关于全面改进代码的问题