Thread-->Join nötig?



  • Hallo,

    in meinem Buch lese ich gerade, das man Join verwenden soll, um Hauptthread zu "pausieren", damit der abgebrochenene Thread erst abgearbeitet wird....da der Hauptthread ja auf das erfolgreiche durchlaufen angewiesen sein könnte!

    Nun habe ich aber einen Code geschrieben, ohne das Join, und irgendwie wird da auch gewartet:

    Die Klasse zum testen

    namespace Multithreading_4
    {
        class ExecClass
        {
            public void ThreadExecute()
            {
                try
                {
                    Console.WriteLine("Sek-Thread gestartet");
                    for (int i = 0; i < 100; ++i)
                    {
                        Console.WriteLine("Sek-Thread-Zähler = {0}", i);
                        Thread.Sleep(50);
                    }
                }
                catch
                {
                    //Thread.ResetAbort();
                    Console.WriteLine("Im Sek-Thread Catch-Block");
                }
                finally
                {
                    Console.WriteLine("Im Sek-Thread Finally Block");
                }
                Console.WriteLine("Nach Finally");
                for (int i = 0; i < 20; ++i)
                {
                    Console.Write(".");
                    Thread.Sleep(100);
                }
            }
        }
    }
    

    und das Programm

    namespace Multithreading_4
    {
        class Program
        {
            static void Main(string[] args)
            {
                ExecClass ecThreadMethodClass = new ExecClass();
                ThreadStart stFirstThread = new ThreadStart(ecThreadMethodClass.ThreadExecute);
    
                Thread trThread = new Thread(stFirstThread);
                trThread.Start();
    
                Console.WriteLine("Thread ist gestartet");
                Console.WriteLine("Vor Abort.......");
    
                Thread.Sleep(200);
    
                trThread.Abort();
                //trThread.Join();
    
                Console.WriteLine("nach Abort......");   //soll abhängige anweisung simulieren
    
                Thread.Sleep(300);
    
                if (trThread.IsAlive)
                    Console.WriteLine("Thread ist noch aktiv");
                else
                    Console.WriteLine("Thread ist nicht mehr aktiv");
    
                Thread.Sleep(5000);
    
                onsole.ReadLine();
            }
        }
    }
    

    ohne Join müsste doch das nach Abort... schon ausgegen werden, bevor die ausgabe aus dem catch und finally block aus der Klasse kommt oder? (laut buch zumindest)...

    bei mir kommt das "nach Abort...." aber wirklich erst ganz am ende, also so, wie es laut buch mit join sein müsste!

    Wieso ist das so?



  • Nein, denn mit Thread.Sleep(200); hältst Du den MainThread an, der andere Thread arbeitet aber weiter, also gibt der 200 ms lang aus, dann kommt erst die Ausgabe aus dem MainThread.

    Lass' das Thread.Sleep(200); mal weg oder verkleinere die Zahl, dann siehstes. 🙂



  • SeboStone schrieb:

    Nein, denn mit Thread.Sleep(200); hältst Du den MainThread an, der andere Thread arbeitet aber weiter, also gibt der 200 ms lang aus, dann kommt erst die Ausgabe aus dem MainThread.

    Lass' das Thread.Sleep(200); mal weg oder verkleinere die Zahl, dann siehstes. 🙂

    also ist join doch nötig...



  • Wenn Du sicher gehen willst: jep.


Anmelden zum Antworten