2016-06-21 63 views
1

我有一个while循环,当我按下按钮时开始。我正在使用它来维护与另一台计算机上的服务的通信。问题是,当我从另一台计算机收到“Completed”消息时,我需要它跳出while循环并停止收听,直到再次按下按钮。我所做的没有任何事情似乎将它从循环中分离出来。我如何摆脱这个特殊的while循环?

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

我试过把打破;就在交换机的第一个案例结束之前,没有这样的运气,我不确定是否因为它是一个switch语句,预计会休息;案件之间或原因是什么。我也试过把归还;在那里,但它仍然不会爆发。我最终不得不关闭应用程序并重新启动它以再次使用该按钮。

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); 
} 
+0

每个'case'在开关必须具有'打破;'在末端。在案件发生后你需要跳出while循环。 – pay

+0

问题在于如果案件“已完成”,我只想分手。 –

+0

可能只是做好友说的话,设置一个'bool'并做'if(someBool){break; }'作为'while'语句后的第一行 – pay

回答

5

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

当你进入下一次迭代时,如果这个值是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; 
} 
 
+0

这不会工作正确,因为你在下一次迭代中打破,这意味着你将尝试再次阅读。在switch语句下面放置中断 – SynerCoder

+0

依赖流后面的内容,但不知道你是否正确,最好是安全而不是抱歉。 – Sidewinder94

+0

到目前为止,这不起作用,我不知道为什么。我放了一个消息框来提示我告诉我,基于isFinished的条件代码块是否真的被执行,但它没有执行,尽管isFinished在完成之后被设置为true,就像上面一样。 –