Parce que text
est partagé ,. Le fil t1 peut démarrer (en arrière-plan) et le texte peut être assigné à t2 avant que le fil t1 puisse imprimer quoi que ce soit. Donc les deux imprimer t2. Si les choses se passaient assez vite, il pourrait parfois imprimer t1 suivi de t2.
Depuis un exemple simple a été donné, je donnerai une solution simple (mais pas trop utile):
string text = "t1";
Thread t1 = new Thread(() => Console.WriteLine(text));
t1.Start(); // why do not print 't1'?
t1.Join(); // Wait for thread t1 to finish before continuing
text = "t2";
Thread t2 = new Thread(() => Console.WriteLine(text));
t2.Start(); // print 't2'
La différence est que vous attendez pour le fil t1 pour terminer l'exécution avant d'attribuer text
une nouvelle valeur. Je donne seulement cet exemple comme comment vous pouvez utiliser Join pour attendre la fin d'un thread.
Une façon un peu plus complexe sans utiliser des expressions Lamda. Si vous créez une fonction statique pour faire le travail que vous pouvez passer un seul paramètre (tout type de object
) à la fonction de démarrage sur le fil:
public static void DoPrint(object data)
{
Console.WriteLine((String)data);
}
static void Main(string[] args)
{
string text = "t1";
Thread t1 = new Thread(DoPrint);
t1.Start(String.Copy(text)); // Pass a copy of text to Thread and start
text = "t2"
Thread t2 = new Thread(DoPrint);
t2.Start(String.Copy(text)); // Pass a copy of text to Thread and start
}
Remarquez comment nous faisons une copie des données de texte avant de passer en De cette façon, même si text = "t2"
se fait avant que le thread t1 ne s'imprime, cela n'aura pas d'importance car une copie a été passée. Si les deux lignes de départ avaient été:
t1.Start(text);
t2.Start(text);
alors nous aurions eu le même problème que votre exemple original pour les mêmes raisons. text est une chaîne, et les chaînes sont une classe donc elles sont passées par référence.
Run suffisamment de fois, et il pourrait en fait, à l'occasion –
au lieu de downvoting sa question, juste fournir quelques suggestions pour lui. – RajeshKannan