我如何打破这个特定的 while 循环?
How do I break out of this particular while loop?
我有一个 while 循环,它在我按下按钮时开始。我用它来保持与另一台计算机上的服务的通信。问题是,当我从另一台计算机收到 "Completed" 消息时,我需要它跳出 while 循环并停止收听,直到再次按下按钮。我做的任何事情似乎都无法解决这个问题。
请注意整个过程是在它自己的线程中执行的。
我尝试将 break; 放在 switch 中第一个 case 结束之前,但没有这样的运气,我不确定是不是因为它是一个期望的 switch 语句休息;案件之间或原因是什么。我也试着把 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);
}
定义一个布尔变量来保存您收到 "Completed" 消息的事实。
当您将进入下一次迭代时,如果此值为 true
,则您会中断并退出循环。
示例:
// 缩写
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
数据 = System.Text.Encoding.ASCII.GetString(字节, 0, i);
<strong>bool breakTheWhile = false;</strong>
开关(数据)
{
案例"Completed":
// 缩写
<strong>breakTheWhile = true;</strong>
休息;
案例"FIU":
// 缩写
休息;
案例"DSF":
// 缩写
休息;
默认:
// 缩写
休息;
}
<strong>if (breakTheWhile)
休息;</strong>
}
我有一个 while 循环,它在我按下按钮时开始。我用它来保持与另一台计算机上的服务的通信。问题是,当我从另一台计算机收到 "Completed" 消息时,我需要它跳出 while 循环并停止收听,直到再次按下按钮。我做的任何事情似乎都无法解决这个问题。
请注意整个过程是在它自己的线程中执行的。
我尝试将 break; 放在 switch 中第一个 case 结束之前,但没有这样的运气,我不确定是不是因为它是一个期望的 switch 语句休息;案件之间或原因是什么。我也试着把 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);
}
定义一个布尔变量来保存您收到 "Completed" 消息的事实。
当您将进入下一次迭代时,如果此值为 true
,则您会中断并退出循环。
示例:
// 缩写
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
数据 = System.Text.Encoding.ASCII.GetString(字节, 0, i);
<strong>bool breakTheWhile = false;</strong>
开关(数据)
{
案例"Completed":
// 缩写
<strong>breakTheWhile = true;</strong>
休息;
案例"FIU":
// 缩写
休息;
案例"DSF":
// 缩写
休息;
默认:
// 缩写
休息;
}
<strong>if (breakTheWhile)
休息;</strong>
}