为什么异步方法中的while循环不会停止?

时间:2015-02-13 10:11:43

标签: c# while-loop

我在我的应用中使用async方法获得了以下代码

b_saving = true;

while (b_saving == true)
{
     try
     {
          if (1 == 1)
                b_saving = false;

          // anything down here should not execute?               
          i_should_not_run();

     }
     catch{
     }
     finally{
     }
}

我对此代码的期望是,只要b_saving设置为false,它就会停止。然而,当我运行它时,情况并非如此。断点显示即使b_saving为false,该方法也会继续。

while循环在C#中不能以这种方式工作吗?

8 个答案:

答案 0 :(得分:2)

即使将b_saving设置为false,循环仍将继续,除非您在其中放置break命令,while循环将继续执行,直到其块结束,然后才重新启动评估条件,在这种情况下,最有可能避免循环的另一次迭代,除非您在b_saving方法中将i_should_not_run设置为true。

PS你可以在while中写一个更简单的条件,不需要把== ...

  while (b_saving)

答案 1 :(得分:0)

b_saving = true;

while (b_saving == true)
{
     try
     {
          bool stop = true;

          if (stop == true)
          {
                b_saving = false;
                break;
          }

          // anything down here should not execute?               
          i_should_not_run();

     }
     catch{
     }
     finally{
     }
}

答案 2 :(得分:0)

它将继续运行代码,直到执行While检查。

如果你想提前摆脱循环,那么你需要一个break;语句。

答案 3 :(得分:0)

您需要使用break来停止执行,如下所示

b_saving = true;

while (b_saving == true)
{
     try
     {
          if (1 == 1){
                b_saving = false;
                break; // Will exit the loop
             }

          // anything down here should not execute?               
          i_should_not_run();

     }
     catch{
     }
     finally{
     }
}

Read

  

break语句终止它出现的最近的封闭循环或switch语句。控制权将传递给终止语句后面的语句(如果有)。

答案 4 :(得分:0)

为了让while循环停止而不继续执行该方法,你的if语句应该是这样的:

if(1 == 1)
{
    b_saving = false;
    break;
}

break关键字将退出循环。

答案 5 :(得分:0)

这与async或try / catch无关。

b_saving设置为false只是故事的一部分 - 在您实际测试其值并根据采取行动之前,它只有效果(在这种情况下退出{{ 1}}循环)。

这是循环始终运行的方式。

您可能也会从编译器中获得有趣的结果(取决于语言) - 某些代码可能会被删除,因为它实际上是无用的。

答案 6 :(得分:0)

此循环应该首次执行b_saving == true一次。在循环内,您将b_saving设置为false,这样它就不会再次执行。

要阻止调用i_should_not_run,请添加break语句。

答案 7 :(得分:0)

几点:

  1. 上面的代码将在设置完成后完成整个循环 m_saving标志为false,我希望它立即停止你应该 使用break关键字说明它。
  2. 根据" m_saving"的名称判断您使用的成员,它是一个局部变量,因此在多线程场景中,您应该使用原子操作机制对其进行读写。
  3. catch块是否应为空?
  4. 只是一个需要考虑的模板

    为{;;}   {       尝试       {        如果(hasToStop)        {            打破;        }       }       catch {hasToStop = true;}   }