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".