Hallo Community
Ich habe ein Problem mit dem beenden eines Threads:
Der Thread sieht in etwa so aus:
try
{
this.m_Running = true;
while (this.m_Running)
{
this.GetValues();
this.Refresh();
System.Threading.Thread.Sleep(100);
}
}
und beim Beenden (FormClosing event)
private void Form_2_FormClosing(object sender, FormClosingEventArgs e)
{
End();
}
private void End()
{
this.m_Running = false;
Thread.Sleep(300);
while (this.m_oThread.IsAlive)
{
Thread.Sleep(50);
}
}
Das Überschriebene Refresh ändert ein paar Pictureboxen nach den Werten von GetValues und ruft dann über ein Delegate die Basisklasse auf um das Paintereigniss der Oberfläche auszulössen. Da ich andere Werte der Oberfläche über das Paint ereigniss ändere.
Das problem ist das delegate, wenn ich das delegate weglasse funktioniert es einwandfrei.
Mit delegate hängt er in der schleife fest, und der oben genannte Thread macht nichts mehr!
wär schön wenn mir jemand Helfen könnte.
mfg
Console
Hallo Console32,
du darfst im GUI-Thread nicht warten. Thread.Sleep ist schon schlecht (verboten), zumindest wenn es mehr als 50ms dauert. while (IsAlive)
setzt da nochmal deutlich einen drauf und führt genau zu dem Deadlock, weil das GUI blockiert ist, der Thread aber auf das GUI wartet. Also warten die gegenseitig. Also ein echtes KO-Kriterium.
Lass den Thread einfach ein eigenes Event feuern, wenn er fertig ist ([FAQ] Eigenen Event definieren) und mach da den Rest (wobei natürlich wieder [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) zu beachten ist). Das FormClosing kannst du ja erstmal abbrechen.
Das haben wir oft genug besprochen. Alles wichtige findest du eh in der FAQ.
herbivore