Est-il tout à fait possible au milieu d'une exécution de fonction de définir un pointeur sur la pile en cours (à récupérer ultérieurement), puis de libérer le thread actuel (sans dérouler la pile d'appels) et de le renvoyer au pool de threads ? Et puis, un autre fil reprendra-t-il là où ce fil s'est arrêté? Je sais que cela signifierait que quelqu'un appelant dans la fonction ne saurait pas que le contexte du thread actuel aurait changé, et cela impliquerait probablement d'écrire du code IL personnalisé pour faire quelque chose comme ça, mais y a-t-il une façon de faire?Dans .NET, la pile d'appels est-elle inextricablement liée à un thread?
Répondre
Non, une pile fait partie de l'état d'un thread. Vous pouvez utiliser des workflows asynchrones pour faire ce genre de chose (et le CCR rend cela plus facile) mais vous ne pouvez pas simplement renvoyer le thread au pool de threads.
Vous pourriez écrire un pool de threads que a fait pour ce faire, mais ce serait une mauvaise idée IMO - ce serait l'équivalent du pool de threads d'appeler Application.DoEvents IMO.
Ce que vous décrivez est des suites délimitées. Malheureusement, le CLR n'a aucun support pour cela, et ne peut pas être implémenté en code managé (pas même en code mixte) avec des trucs que je connais.
Actuellement, j'ai besoin de cette fonctionnalité dans IronScheme. Il existe des moyens de créer ce type de fonctionnalité sur le CLR, en écrivant un compilateur qui effectue une conversion CPS, mais qui provoque une série de problèmes d'interopérabilité (vous ne pouvez pas appeler les fonctions .NET directement, etc.).
J'ai fait quelques expériences avec la conversion CPS dans IronScheme, mais mon compilateur actuel n'est pas vraiment adapté pour cela, et fonctionne plutôt lentement.
- 1. Comment obtenir la taille de la pile d'un thread .NET existant
- 2. Aucune session Hibernate liée au thread
- 3. Comment obtenir la pile de pile dans un appareil mobile?
- 4. Supprimer une image liée à un contrôle
- 5. Récupérer la pile d'appel de n'importe quel thread à l'intérieur de C
- 6. .NET DynamicMethod Thread Safe?
- 7. Mettre à jour le compteur sur le thread dans .NET
- 8. Accès à BackgroundWorkerThread dans un thread
- 9. Comment créer et démarrer un thread paramétré dans .NET 1.1?
- 10. La pile d'un thread est-elle indiquée comme mémoire utilisée dans le Gestionnaire des tâches?
- 11. Ajout d'un thread sans pile au noyau BSD?
- 12. Comment obtenir une pile de chemin de thread non-courante?
- 13. Erreur liée à la fermeture forcée
- 14. C# .net looping débordement de pile de threads
- 15. Tableau dynamique dans la pile?
- 16. Existe-t-il un moyen de soulager la douleur liée au maintien des références d'assemblage .NET?
- 17. glutPostRedisplay dans un thread différent
- 18. Utiliser le multi-thread pour accélérer la réflexion .NET
- 19. Passer un msg à un autre thread dans C#
- 20. Puis-je exécuter un thread plusieurs fois?
- 21. Passage d'un jeton d'emprunt d'identité sur un thread géré à un thread non géré
- 22. ILGenerator: Comment ajouter booléenne à la pile
- 23. Appeler une fenêtre forment un autre thread (.Net)
- 24. dans .NET, Comment définir STAThread lorsque j'exécute un formulaire dans un thread supplémentaire?
- 25. .NET SynchronizationContext - Quel thread envoie-t-il?
- 26. Pouvez-vous relancer une exception .NET sur un thread différent?
- 27. Mesure de l'utilisation de la pile pour l'application multi-thread Linux
- 28. provoque un débordement de pile dans la fonction Clojure.
- 29. Différer BufferedWriter.write à un autre thread
- 30. Existe-t-il un moyen d'assurer l'exécution complète du bloc de code dans un thread .NET?
Pouvez-vous poster plus d'informations sur le problème que vous essayez de résoudre? – cbrulak