【问题标题】:How to cause args to enter an endless loop?如何使 args 进入无限循环?
【发布时间】:2012-06-20 23:28:07
【问题描述】:

我有一个控制台应用程序,它使用许多命令行开关来控制各种方法。每个命令行开关都由一个 for 循环中的 switch 语句处理,该循环遍历每个 args。

        for (int x = 0; x < args.Length; x++)
        {
            switch (args[x])
            {
             ...
            }
         }

这非常适合我的需要,但是我需要添加一个 --loop 开关,它会根据 --set-timeout 开关指定的超时时间来无限期循环前面的参数。

我目前的代码是:

switch (args[x])
{
   case "--set-timeout-5m":
       timeout = 300000;
       System.Threading.Thread.Sleep(timeout);
       break;

       ....

    case "--loop":
        x = 0;
        break;
 }

问题是设置 x 不会导致 for 循环从 args 开始继续。它只是坐在那里。

我希望 x 具有范围,因为代码在 for 循环中,并且在 Visual Studio 中不会生成错误。我也期待 break 语句打破案例并将 x 传递给 for 循环。

谁能解释为什么它不起作用或发布解决方法?

【问题讨论】:

  • 您的“设置超时”没有设置超时,它导致循环立即休眠 5 分钟。这就是你的意思吗?
  • 也就是说,设置的超时是使代码暂停n分钟,--loop开关应该控制循环。用例类似于 program.exe -i --set-timeout-5m --loop
  • 坐在那里是什么意思?尝试调试,看看你的代码在中断时去哪里。
  • 因此,对于您评论中的参数,您希望它循环 5 分钟,然后停止?目前它会等待 5 分钟,然后无限循环。
  • 它应该可以工作。你确定你的“--loop”案例被击中了吗?尝试在“x = 0;”上放置一个断点。

标签: c#


【解决方案1】:
for (int x = 0; x < 10; x++)
{
    Console.Write(x);
    x = 0;
}

打印

0 1 1 1 1 1 1 1 1 ...

因为x++ 在每次迭代后执行。

如果你想打印

0 0 0 0 0 0 0 0 0 ...

你需要改成

for (int x = 0; x < 10; x++)
{
    Console.Write(x);
    x = -1;
}

【讨论】:

    【解决方案2】:

    您的Thread.Sleep 只会阻塞当前线程。要设置超时,请在循环之前获取当前日期:

    DateTime start = DateTime.Now;
    

    然后,在每次迭代中,检查当前时间是否超过了超时时间,如果超过了,则跳出循环:

    if(DateTime.Now.Subtract(start).TotalMilliseconds >= timeout) {
        // Stop your processin'!
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多