Passer de ProcessThread à un thread géré

Nous obtenons régulièrement l’arrêt d’un service Windows dans un environnement de production que nous ne pouvons tout simplement pas reproduire. Cela peut prendre des mois avant que cela ne se reproduise.

J’effectue des diagnostics pour tenter de résoudre le problème. Une des choses que je vois est l’ajout d’un événement au pool de threads système pendant 60 secondes après le lancement de l’arrêt de l’application. Notre application devrait s’arrêter proprement dans un délai maximum de 10 secondes.

Dans ce cas, j’aimerais tracer les autres threads en cours d’exécution du processus dans le journal des événements.

Je peux obtenir les threads en cours d’exécution à l’aide de System.Diagnostics.Process.GetCurrentProcess.Threads. Ces objects de threads ont un identifiant de thread Win32 natif, etc.

Je me demandais s’il était possible de revenir de ces identifiants de fil à des threads gérés qu’ils représentent dans le processus actuel. La raison pour laquelle j’essaie de le faire est que, pour nos pools de threads et les autres threads que nous générons, nous donnons les noms qui représentent leur objective et il serait vraiment utile de les récupérer.

Ceci est impossible pour la raison suivante. Citation de MSDN :

Un ThreadId de système d’exploitation n’a pas de relation fixe avec un thread géré, car un hôte non géré peut contrôler la relation entre les threads gérés et non gérés. Plus précisément, un hôte sophistiqué peut utiliser l’API d’hébergement CLR pour planifier plusieurs threads gérés avec le même thread du système d’exploitation ou pour déplacer un thread géré entre différents threads du système d’exploitation.

Il n’y a donc pas de correspondance unique entre les threads gérés et les threads de système d’exploitation.

Alors maintenant, la question devient, comment obtenir une liste de tous les threads gérés en cours d’exécution dans le processus actuel? Malheureusement, je ne connais pas la réponse.

Cela ne semble pas être possible.
Heureusement pour nous, nous avons nos propres bibliothèques de threads qui encapsulent les bibliothèques .NET et j’ai été capable de mettre en place des fonctionnalités pour conserver une liste de threads actifs que nous pouvons utiliser pour ces diagnostics.
Cela fonctionne assez bien, mais il y a eu pas mal d’efforts à faire et à mettre à l’essai bien sûr, mais j’espère que nous en aurons le final.