【问题标题】:How do I break out of this particular while loop?如何摆脱这个特定的 while 循环?
【发布时间】:2016-06-21 21:55:06
【问题描述】:

当我按下一个按钮时,我有一个 while 循环。我正在使用它来保持与另一台计算机上的服务的通信。问题是,当我从另一台计算机收到“已完成”消息时,我需要它跳出 while 循环并停止监听,直到再次按下按钮。我所做的一切似乎都无法打破循环。

请注意整个过程是在自己的线程中执行的。

我尝试将 break; 放在 switch 中第一个 case 结束之前,但没有这样的运气,我不确定是否是因为它是一个 switch 语句,需要一个 break;案件之间或原因是什么。我也尝试将 return; 放在那里,但它仍然不会爆发。我最终不得不关闭应用程序并重新启动它才能再次使用该按钮。

TcpClient client = new TcpClient(serverIP, 11000);
NetworkStream stream = client.GetStream();
Byte[] bytes = new Byte[256];
String data = null;
int i;

stream.Write(copy, 0, copy.Length);


while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
    //MessageBox.Show(data);
    switch (data)
    {
        case "Completed":
            this.Invoke((MethodInvoker)delegate
            {
                progressBar1.Value = 0;
                progressBar1.Visible = false;
                progressBar1.Update();
                if (prod)
                {
                    sqlLink.setProdFile(imageName, destFileName);
                } else
                {
                    sqlLink.setTestFile(imageName, destFileName);
                    if (sqlLink.getTestVM(imageName) != "")
                    {
                        if (message.Text("Test VM", "Power on specified Virtual Machine in private mode?", MessageBoxButtons.OKCancel) == DialogResult.OK)
                        {
                            PS ps = new PS();
                            ps.powerOnVM(sqlLink.getTestVM(imageName));
                        }
                    }
                }
                //Tried putting break; here.                            
            });
            break;
        case "FIU":
            {
                progressBar1.Value = 0;
                progressBar1.Visible = false;
                progressBar1.Update();
                message.Text("Error", "The image is in use. Try shutting down machines or unassigning devices.", MessageBoxButtons.OK);
            }
            break;
        case "DSF":
            {
                progressBar1.Value = 0;
                progressBar1.Visible = false;
                progressBar1.Update();
                message.Text("Error", "Drive space is full on production volume. Try deleting some older images.", MessageBoxButtons.OK);
            }
            break;
        default:
            this.Invoke((MethodInvoker)delegate
            {
                progressBar1.Value = Int16.Parse(data);
                progressBar1.Update();
            });
            break;
    }
 }
    stream.Close(); //This never happens.
    client.Close();
}
catch (Exception ex)
{
    message.Text("Error", "Copy Method Error: " + ex.Message, MessageBoxButtons.OK);
}

【问题讨论】:

  • 开关中的每个case 必须在末尾有一个break;。遇到案例后,您需要跳出 while 循环。
  • 这里的问题我只想在案件“完成”的情况下打破。
  • 可能就照哥们说的做吧,设置bool,在while语句后的第一行做if(someBool) { break; }
  • 哦,让我试试吧!谢谢
  • 听起来像a perfect time 使用goto 关键字。

标签: c# while-loop tcplistener


【解决方案1】:

定义一个布尔变量,用于保存您收到“已完成”消息的事实。

当您将进入下一次迭代时,如果此值为 true,那么您将中断并退出循环。

示例:


// Abbreviated
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
    bool breakTheWhile = false;
    switch (data)
    {
        case "Completed":
            // Abbreviated
            breakTheWhile = true;
            break;
        case "FIU":
            // Abbreviated
            break;
        case "DSF":
            // Abbreviated
            break;
        default:
            // Abbreviated
            break;
    }
    if (breakTheWhile)
        break;
 }

【讨论】:

  • 这不会正确工作,因为您在下一次迭代中中断意味着您将尝试再次阅读。将 break 放在 switch 语句下方
  • 取决于流背后的内容,但不知道,你是对的,最好是安全而不是抱歉。
  • 到目前为止这不起作用,我不知道为什么。我放了一个消息框来提示我告诉我基于您添加的 isFinished 的条件代码块是否实际执行但它没有执行,尽管 isFinished 在完成后设置为 true,就像您在上面所做的一样。
  • 我想我知道它为什么不起作用。这是因为 while 循环仅在字节不等于 0 时才执行代码块。它需要另一条消息来执行代码中的中断。我可能需要像@SnyderCoder 建议的那样把它放在循环的底部
  • 这行得通,原来我的问题是服务器上的磁盘已满问题和未初始化的事件处理程序,因此它没有像应有的那样通知我。也就是说,我认为我需要认真重构代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 2022-12-02
  • 2016-03-11
  • 2019-01-15
相关资源
最近更新 更多