2017-02-07 5 views
0

Y at-il un moyen de définir le code de sortie de thread manuellement en C# (à des fins de débogage)?Définir le code de sortie du fil manuellement en C#?

La réponse sélectionnée d'une question connexe « What is a thread exit code? » déclare:

0 tend à dire qu'il est sorti en toute sécurité alors que toute autre chose tend à signifier qu'il n'a pas quitté comme prévu. Mais alors ce code de sortie peut être défini dans le code par vous-même pour complètement ignorer cela.

Est-il vraiment un moyen de définir le code de sortie d'un thread moi-même?

+0

Vous ne devriez pas utiliser/compter sur eux dans .net, raisons/explication [ici] (https://stackoverflow.com/questions/5628908/whats-the-equivalent-of-exitthreadexitcode-and-getexitcodethread-in -c-sharp). –

+0

Il existe un appel d'API Windows ['ExitThread (DWORD)'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682659 (v = vs.85) .aspx) qui se termine par thread en utilisant le code de sortie fourni. Mais je suis sûr que c'est une très mauvaise idée d'appeler cela à partir de threads gérés, pour les raisons liées par Manfred –

Répondre

3

Les threads .NET ne possèdent pas de codes de sortie. Ceux-ci sont utilisés par les threads natifs sur Windows, mais les threads natifs sont uniquement utilisés par des threads gérés et n'ont pas de correspondance 1: 1 avec un thread géré donné. Le même thread géré peut s'exécuter sur plusieurs threads natifs et vice versa (bien que ce ne soit évidemment pas le cas en même temps). Pour citer MSDN:

Un ThreadId du 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 Fibre pour planifier de nombreux threads gérés sur le même thread de système d'exploitation ou pour déplacer un thread géré entre différents threads du système d'exploitation.

Cela vaut évidemment pour toutes les ressources liées au fil natif - mais le moteur d'exécution ne gère les gérées ressources d'un fil, bien sûr; et pour le code non managé appelant en code managé, le thread sera maintenu le même - sinon interop serait tout à fait impossible.

Si vous souhaitez ajouter des informations supplémentaires aux tâches, essayez d'utiliser un niveau d'abstraction plus élevé, par exemple. Task. Besoin de sortir le statut d'une tâche à la fin? Ajouter une continuation Besoin de vérifier l'état d'une tâche pour laquelle vous avez une référence? Attendez-le ou interrogez l'objet.

+0

"Le même thread géré peut fonctionner sur plusieurs threads natifs", comment? –

+0

@MathuSumMut Pourquoi pas? Il n'est en aucun cas lié aux threads natifs. Le moteur d'exécution décide quels threads natifs gèrent les threads gérés. – Luaan

+0

Pourquoi un thread géré ne lierait pas 1: 1 avec un thread natif? Cela afin de maintenir l'interopérabilité. Je sais que vous utilisez ce qui est techniquement autorisé par la spécification, mais il n'y a aucun avantage à ne pas mapper 1: 1, et en fait, pour ne pas lier avec l'implémentation, il existe un pool de threads séparé pour cela. –