Laden...

Thread wird nicht beendet

Erstellt von noobee vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.208 Views
N
noobee Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren
Thread wird nicht beendet

Hallo,

ich habe zum Test fürs Threading eine kleine Anwendung erstellt, welche simple Berechnungen durchführt. Da ich in dem Thema nicht wirklich drin bin, hab ich nur ein kleines Beispiel zum Testen gebastelt. Meine Frage wäre, wie ich den Thread wieder sauber beende. Es wird zwar alles berechnet und angezeigt in der textbox2, jedoch läuft der Thread nach den Berechnungen weiter (was auch immer dieser dann im Hintergrund noch tut... wahrscheinlich ist er "idle")


// summiere 3 Zahlen aus Array
            if (radioButton2.Checked && isRadbioButtonSelected)
            {               

                new Thread(() =>
                {
                    Thread.CurrentThread.IsBackground = true;

                    for (int i = 0; i < zahlenArrayLaenge - 1; i++)
                    {
                        for (int j = i + 1; j < zahlenArrayLaenge; j++)
                        {
                            for (int k = j+1; k < zahlenArrayLaenge; k++)
                            {
                                if (Convert.ToDouble(stringArray[i]) + Convert.ToDouble(stringArray[j]) + Convert.ToDouble(stringArray[k]) == sum)
                                {
                                    textBox2.Invoke((MethodInvoker)(() => textBox2.AppendText(sum + " = " + stringArray[i] + " + " + stringArray[j] + " + " + stringArray[k] + Environment.NewLine)));
                                    
                                    counter++;
                                                                    
                                }
                            }
                        
                        }

                    }
                    //Thread.CurrentThread.Abort(); Thread.CurrentThread.Join();

                }).Start();

                //Application.ExitThread();
                //Environment.Exit(0);
                //Thread.CurrentThread.Abort();
                //Thread.CurrentThread.Join();

            }

T
2.224 Beiträge seit 2008
vor 5 Jahren

Wenn du dir sicher bist, dass der Thread noch läuft, kann dies ja nur bedeuten, dass er durch deine verschachtelten Schleifen noch nicht vollständig durchgelaufen ist.
Je nachdem wie groß der Wert in zahlenArrayLaenge ist, dürfte dies auch einige Zeit dauern.

Anstelle eines eigenen Threads könntest du dir auch mal async/await anschauen.
Eigene Threads sollte man nicht mehr anlegen, da man damit den .NET ThreadPool umgeht und das erstellen neuer Threads zusätzliche Resourcen kostet.

Ebenfalls solltest du dir vorab auch Tasks in .NET anschauen, auf die dann auch async/await aufbaut.
Ist natürlich noch etwas früh für async/await, aber dies ist für das arbeiten mit asynchronem Code in der UI gedacht.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

C
2.121 Beiträge seit 2010
vor 5 Jahren

jedoch läuft der Thread nach den Berechnungen weiter

Woran merkst du das?

Ist zwar auskommentiert aber ein Join auf den CurrentThread ist nicht sehr hilfreich. Das wartet bis der Thread beendet ist und wenn der aktuelle Thread sich nicht beenden kann weil er darauf wartet bis er beendet ist...

Ist natürlich noch etwas früh für async/await

Find ich auch. Erst mal Erfahrungen sammeln halte ich für unbedingt nötig. Sonst beschäftigt sich jemand nur mit High End Dingen und wird die niemals vollständig verstehen, weil alle Grundlagen fehlen.
Welchen Vorteil hätte async/await hier?

16.835 Beiträge seit 2008
vor 5 Jahren

Ist natürlich noch etwas früh für async/await, aber dies ist für das arbeiten mit asynchronem Code in der UI gedacht.

Der Ursprung kommt vom Arbeiten mit asynchronen Kommunikationskanälen.
Aber async/await kann auch für UI verwendet werden - jedoch nicht für alles. Gerade Berechnungen müssen/sollten weiter in einen eigenen Thread/Task abgeführt werden.