J'ai une boucle while qui commence quand j'appuie sur un bouton. Je l'utilise pour maintenir la communication avec un service sur un autre ordinateur. Le problème est que lorsque je reçois le message "Terminé" de l'autre ordinateur, j'en ai besoin pour sortir de la boucle while et arrêter d'écouter jusqu'à ce que le bouton soit à nouveau enfoncé. Rien de ce que je fais ne semble sortir de la boucle.Comment puis-je sortir de cette boucle while particulière?
Veuillez noter que tout le processus est exécuté dans son propre thread.
J'ai essayé de mettre pause; juste avant la fin du premier cas dans le commutateur, pas de chance et je ne suis pas sûr si c'est parce que c'est une déclaration de commutateur qui attend une pause; entre les cas ou quelle est la raison. J'ai également essayé de mettre retour; là mais il ne va pas encore sortir. Je finis par devoir fermer l'application et redémarrer pour utiliser le bouton à nouveau.
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);
}
Chaque 'case' dans le commutateur doit avoir une' briser; 'à la fin. Vous aurez besoin de sortir de la boucle while après que le cas soit touché. – pay
Le problème est que je veux seulement sortir si le cas est "terminé". –
Probablement juste faire ce que mon pote a dit, mettre un 'bool' et faire' if (someBool) {break; } 'en tant que première ligne après la déclaration' while' – pay