2016-06-21 65 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,就像上面一樣。 –