MainThread.Join()

Alla ricerca di una soluzione per il QuizSharp di Adrian mi sono imbattutto in una bella stranezza del Threading: a quanto posso vedere il Thread principale di un'applicazione NON termina finché non terminano tutti i Thread "secondari" con piorità almeno Normal.

La prova:

class Foo 

    
static System.Threading.Thread MainThread; 

    
static void SecThread() 
    { 
        
if (MainThread.IsAlive)
          MainThread.Join();
        Console.WriteLine("Fine Thread Secondario");
    } 

    
static void Main() 
    { 
        MainThread = System.Threading.Thread.CurrentThread; 
        System.Threading.Thread ST = 
new System.Threading.Thread(new System.Threading.ThreadStart(SecThread)); 
        ST.Priority = System.Threading.ThreadPriority.AboveNormal; 
        ST.Start();
        Console.WriteLine("Fine Thread Principale");
    } 
}

Questo codice NON termina MAI, perché la Procedura SecThread che gira nel Thread "secondario" aspetta che il Thread principale dell'applicazione termini, ma questo NON termina!!! L'applicazione raggiunge l'ultima riga di Main, stampa a console "Fine Thread Principale", ma in realtà il Thread principale sopravvive alla fine del Main ed entra nello stato composito di: "Background, Stopped, WaitSleepJoin", tant'é vero che é necessario modificare il codice come segue:

static void SecThread() 
{    
    
/*if (MainThread.IsAlive)
        MainThread.Join();*/
    
while (MainThread.ThreadState == System.Threading.ThreadState.Running)
        MainThread.Join(1000);
    Console.WriteLine("Fine Thread Secondario");

Per riuscire ad ottenere l'effetto desiderato! Ovviamente l'output non é veritiero in quanto apparirà prima "Fine Thread Principale" che "Fine Thread Secondario".

Print | posted on lunedì 18 luglio 2005 15:43

Comments on this post

# re: MainThread.Join()

Requesting Gravatar...
FYI - you should be able to simply call MainThread.Join without checking its state. You don't need a while loop either, as Join blocks until the thread has completed.
Left by Brian Grunkemeyer on ago 27, 2005 2:39

# re: MainThread.Join()

Requesting Gravatar...
Hi Brian, welcome to my blog!
Yeah, I know I don't need to check the thread state, but the problem is that or without that check the code freeze!
The only way to solve that problem I found is to use the following lines:
while (MainThread.ThreadState == System.Threading.ThreadState.Running)
MainThread.Join(1000);
Console.WriteLine("Fine Thread Secondario");

It's strange like the MainThread of an applications is waiting the end of the other threads to ends too...
Left by Michele Bernardi on ago 29, 2005 4:53
Comments have been closed on this topic.