2009-10-11 8 views
6

Je suis nouveau en C# .J'ai appris que normalement tous les threads sont en premier plan jusqu'à ce que vous le spécifiiez explicitement comme thread "background" en utilisant IsBackGround = true.Threads d'arrière-plan en C#

Certains doutes sont apparus dans mon esprit.

1) Quel est l'avantage de garder un fil comme fil de fond?

2) Lors de l'exécution du code folowing:

static void Main(string[] args) 
    { 
     Thread worker = new Thread(SayHello); 
     worker.IsBackground = true; 
     worker.Start(); 
     Console.WriteLine("Hello From Main"); 
    } 

    static void SayHello() 
    { 
     Console.WriteLine("Hello World"); 
     Console.ReadKey(true); 
    } 

je dois utiliser worker.Join() pour garder le fil conducteur d'attendre que le programme se termine immédiatement. En dehors de Join() pourrais-je utiliser d'autres techniques pour faire patienter le thread principal?

+3

Filetage en C# est une chose assez intéressante. Je recommande vivement le livre ClR via C# de Jeffrey Richter. Il a une explication du noyau de Windows sur le fonctionnement des threads en C#. Malheureusement, la plupart de ces concepts se retrouvent sur l'API de threading C++ Win32. – Spence

+3

Vous allez avoir plus de plaisir avec la synchronisation des threads. Jetez un oeil sur le système.Threading.Semaphore, ManualResetEvent, AutoResetEvent, Mutex et les classes Interlocked. Ils sont tous très utiles pour faire des choses de threading. – Spence

+0

Merci Spence Merci beaucoup. Je vais y jeter un coup d'oeil. – user186973

Répondre

11

1) Quel est l'avantage de conserver un filetage comme fil de fond?

L'avantage est qu'un thread d'arrière-plan ne s'arrête pas le programme de se terminer. Dans une grande application, il peut être difficile de désactiver tous les threads si vous voulez quitter l'application.

En dehors de Join() pourrais-je utiliser d'autres techniques pour maintenir le thread principal en attente?

Si vous voulez que le programme principal attende, pourquoi faites-vous un thread de fond en premier lieu ??? En plus de Join(), vous pouvez utiliser EventWaitHandle ou Monitor pour faire patienter la méthode principale.

6

Tout ce que cela signifie est de savoir si ce thread va garder le processus en vie. Si tous les fils de votre processus sont marqués en arrière-plan, .Net fermera votre processus et le forcera à quitter.

En réponse à votre question, oui vous devez vous joindre car le thread qui est en arrière-plan ne le gardera pas en vie, donc lorsque le thread de démarrage quitte Main(), il permettra à l'application de quitter.

3

Si le thread doit se terminer avant la fin du programme, il ne doit pas s'agir d'un thread d'arrière-plan.

Il y a beaucoup de façons de faire attendre votre thread principal, mais dans l'exemple ci-dessus, je pense que ce que vous voulez vraiment faire est de vous assurer que ce n'est pas un thread d'arrière-plan.

La méthode Join est généralement utilisée pour s'assurer que les threads sont exécutés avant que le thread appelant continue. Par exemple, vous pouvez générer 5 threads qui effectuent chacun une opération mathématique et les résultats de ces opérations peuvent être nécessaires pour passer à l'étape suivante. La méthode Join interrompt l'exécution sur le thread appelant jusqu'à ce que les threads générés puissent être terminés. Il est important de noter que si vous appelez Join à partir du thread de l'interface utilisateur, vous gèlerez votre programme jusqu'à ce que les threads générés soient terminés.

En bref, le multi-threading est vraiment compliqué et nuancé. Je recommande fortement d'acheter un bon livre sur le sujet.