2010-11-16 5 views
0

Je veux tuer un fil quand quelque chose de très mauvais arrive. Quelle est votre suggestion de faire du suicide?question de suicide de fil

+0

Tuer un thread ** est ** quelque chose de très mauvais. –

+7

Voir [Comment tuer un fil instantanément en C#? ] (http://stackoverflow.com/questions/1327102/how-to-kill-a-thread-instantly-in-c). Aussi, je pense que vous voulez dire l'homicide ... :) –

+2

Il n'est pas considéré comme un suicide si vous forcez le fil – Toad

Répondre

2

Vous ne devriez jamais "tuer" un thread. À partir de votre programme principal, vous pouvez l'abandonner en utilisant la méthode Thread.Abort, mais ce n'est pas recommandé, et c'est complètement inutile.

Votre thread ne devrait être rien de plus qu'une méthode exécutant une longue boucle. Si quelque chose de "vraiment mauvais" se produit, revenez simplement de cette méthode et le thread se terminera.

Ce serait suffisant pour une telle boucle:

private void MyThreadLoop() 
{ 
    try 
    { 
     while (someCondition) 
     { 
      // do a lengthy operation 
     } 
    } 
    catch (Exception ex) 
    { 
     Log.Error("Something bad happened: ", ex); 
    } 
} 

public void Start() 
{ 
    Thread t = new Thread(MyThreadLoop); 
    t.Start() 
} 

D'autre part, si vous avez besoin de votre programme principal pour tuer le fil (mais ce n'est pas un « suicide » comme vous l'avez nommé), alors vous devriez signaler le fil que vous voulez qu'il se termine, et ne pas l'abandonner sans savoir ce qui se passe en arrière-plan.

0

Il n'est pas nécessaire de tuer complètement un thread, tout ce que vous avez à faire est de le faire arrêter de travailler sur la tâche en cours.

0

À l'intérieur du fil, il suffit de revenir de sa fonction. En dehors du thread, il y a la méthode Thread.Abort().

0

Vous pourriez essayer quelque chose comme ça. Le thread s'exécute jusqu'à ce qu'il reçoive un signal de "outside" et existe ensuite.

private static void Main(string[] args) 
{ 
    var shouldExit = new AutoResetEvent(false); 

    ThreadPool.QueueUserWorkItem(
    delegate 
    { 
     while (true) 
     { 
      Console.WriteLine("Running..."); 

      if (shouldExit.WaitOne(0)) break; 
     } 

     Console.WriteLine("Done."); 
    }); 

    // wait a bit 
    Thread.Sleep(1000);  
    shouldExit.Set(); 

    Console.ReadLine(); 
}