2010-03-01 7 views
3

Normalement, je créais chaque thread par action que je voulais faire multithread. Je faisais comme ça:Existe-t-il un moyen de vérifier ce qui fonctionne dans le pool de threads .NET?

private Thread threadForWycena; 

private void someMethod() { 
     threadForWycena = new Thread(globalnaWycena); 
     threadForWycena.Start(); 
} 

Ensuite, lorsque l'utilisateur a voulu fermer l'une des années que je vérifiais graphiques pour ce fil et si elle était sur i était dissalowing pour le fermer.

private void ZarzadzajOplatamiGlobalneDzp_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (threadForWycena.IsAlive) { 
      MessageBox.Show("Wycena jest w toku. Zamknięcie okna jest niemożliwe.", "Brak wyjścia :-)"); 
      e.Cancel = true; 
     } 
    } 

Est-il possible de le faire en utilisant ThreadPool, afin que je puisse empêcher la fermeture de la fenêtre et je peux dire utilisateur quel thread est toujours en vie et ce qui est qu'il fait?

Répondre

3

Il n'existe aucun moyen direct de détecter la fin d'un élément de travail de pool de threads dans .NET. Cependant, il n'est pas difficile d'en ajouter un.

  • Créer une ManualResetEvent
  • A la fin de l'élément de travail défini cet événement.
  • Pour vérifier si l'élément de travail est terminé, effectuez un délai d'attente de zéro. Attendez sur l'événement pour voir s'il a été défini.

E.g. (En utilisant un lambda pour fermer au-dessus de l'événement et de ne pas modifier le code à exécuter dans le threadpool):

var e = new ManualResetEvent(false); // false => not set to sart 
ThreadPool.QueueUserWorkItem(_ => { FunctionToCall(); e.Set(); }); 
// Continue concurrently.... 
if (e.WaitOne(0)) { 
    // The work item has completed 
} 

Par ailleurs, dans Framework 4, la classe de la tâche (et les sous-types) fournit un modèle beaucoup plus riche pour exécuter code dans le pool de threads, y compris la possibilité de retourner directement les résultats, ou de continuer avec une autre tâche.

+0

Il est donc plus difficile de l'utiliser sans piscine. Je me demande simplement s'il va sembler «boiteux» d'utiliser beaucoup de «thread privé threadForWycena;» (bien sûr avec un nom différent au lieu d'un pool.) Il m'est plus facile de savoir ce qui se passe, ce qui fonctionne et ce qui ne fonctionne pas. La fonctionnalité en cours d'exécution ne sera pas répétée avant la fin de l'ancien. – MadBoy

1

RegisterWaitForSingleObject signale la poignée d'attente à la fin de l'exécution.

+0

Et comment l'utiliserait-il correctement compte tenu de l'exemple que j'ai donné? – MadBoy