J'ai lu des avis contradictoires sur le fait que chaque BeginInvoke() doit être associé à un EndInvoke(). Y a-t-il des fuites ou d'autres problèmes associés à ne pas appeler EndInvoke()?EndInvoke() est-il optionnel, tri-optionnel ou définitivement non-optionnel?
Répondre
Delegate.EndInvoke est documenté comme tu appelleras ce (c.-à-nécessaire - les fuites se produisent d'autre) - de msdn:
Note importante
N'importe quelle technique que vous utilisez, appelez toujours EndInvoke pour compléter votre asynchrone c tout.
Control.EndInvoke est OK ignorer pour et oublier le feu des méthodes - de msdn:
Vous pouvez appeler EndInvoke pour récupérer la valeur de retour du délégué, si neccesary, mais n'est pas requis.
Cependant - si vous utilisez Delegate.BeginInvoke
et ne veulent pas le résultat, pensez à utiliser à la place ThreadPool.QueueUserWorkItem
- ça va rendre la vie beaucoup plus facile, et éviter la douleur de IAsyncResult
etc.
Merci Marc, c'est ce qui a motivé la question - je regardais Richter et j'ai remarqué QueueUserWorkItem, et j'ai pensé "attendez, pourquoi est-ce que j'utilise BeginInvoke/EndInvoke ailleurs". – endian
@endian - en effet: la plupart des utilisations de BeginInvoke peuvent être faites plus simplement avec ThreadPool; le BeginInvoke est peut-être utile pour faire quelques choses et les rassembler de nouveau après ... –
Enlightened. Merci! – rpattabi
EndInvoke n'est pas facultatif.
Plus d'info here
Merci Luca - réponse acceptée. – endian
... pour les délégués, au moins ;-p –
à partir de votre lien: "La seule exception documentée à la règle que je connaisse est dans Windows Forms, où vous êtes officiellement autorisé à appeler Control.BeginInvoke sans prendre la peine de appelez Control.EndInvoke. " – Avram
et appel EndInvoke n'est pas un appel optionnel, c'est une partie du contrat. Si vous appelez BeginInvoke, vous devez appeler EndInvoke.
Exemple classique de la raison pour laquelle cela est nécessaire. Il est très possible que le IAsyncResult retourné par BeginInvoke ait alloué des ressources qui lui sont attachées. Le plus souvent un WaitHandle de toutes sortes. Comme IAsyncResult n'implémente pas IDisposable, un autre emplacement doit être choisi pour libérer les ressources. Le seul endroit où le faire est EndInvoke. Je discute brièvement de ce problème dans l'article de blog suivant:
http://blogs.msdn.com/jaredpar/archive/2008/01/07/isynchronizeinvoke-now.aspx
Merci Jared, très apprécié. – endian
EndInvoke n'est pas facultative, car elle est le lieu où des exceptions sont levées en cas de problème dans le traitement asyncronous. Quoi qu'il en soit, il ne devrait pas y avoir de fuite parce que si IAsyncResult détient une ressource native, il devrait implémenter correctement IDisposable et disposer de telles ressources lorsque le GC appelle son finaliseur.
C'est seulement facultatif si vous ne vous occupez pas de la mémoire de votre programme en grandissant. Le problème est que le GC conserve toutes les références dans votre thread, car vous pouvez appeler EndInvoke à un moment donné. J'irais avec la réponse de Marc, le pool de threads vous facilitera la vie. Cependant, vous devez faire attention si vous générez des threads à partir de vos threads, car il est limité dans le nombre de threads qu'il peut faire tourner.
Cela n'est pas facultatif car l'appel de BeginInvoke utilise un WaitHandle qui, à son tour, utilise un objet noyau qui maintient un compte pour le nombre de références qui lui sont associées.Appeler EndInvoke dispose gracieusement le descripteur qui décrémente ce compteur sur l'objet du noyau et lorsque ce compte atteint zéro, le gestionnaire d'objets du noyau le détruira.
Chaque réponse à cet article indique que EndInvoke() n'est pas facultatif. Cependant, j'ai trouvé le commentaire suivant très bien classé qui est la réponse acceptée sur ce thread SO:
"Notez que l'équipe Windows Forms a garanti que vous pouvez utiliser Control.BeginInvoke de manière 'fire and forget' - c'est à dire sans jamais appeler EndInvoke.Ce n'est pas le cas des appels asynchrones en général: normalement, chaque BeginXXX devrait avoir un appel EndXXX correspondant, généralement dans le rappel. "
IMHO, c'est dommage que 'Control.BeginInvoke' et' Delegate.BeginInvoke' partagent le même nom, car ils ont une sémantique totalement différente; à vrai dire, je suis curieux de savoir pourquoi les types de délégués définissent 'BeginInvoke' est une méthode d'instance, plutôt que d'avoir' Delegate.Bind (params) 'retourne un' MethodInvoker' [délégué zéro-argument] qui invoquerait le délégué avec les paramètres spécifiés, et qui pourraient être passés à une méthode ThreadPool.BeginInvoke. – supercat
+1 pour cette distinction importante. Le commentaire du Skeet omniscient (cité ci-dessus) est très pertinent pour ceux qui considèrent les situations Control.InvokeRequired. –
- 1. C# 4 paramètre optionnel
- 2. Supprimer définitivement un répertoire de git
- 3. Paramètre optionnel dans les fonctions MVEL
- 4. Est-ce que chaque BeginInvoke doit être suivi d'un EndInvoke?
- 5. VB.NET équivalent d'argument optionnel Range dans la fonction VBA
- 6. Comment faire paramètre optionnel dans Zend Framework Router
- 7. Erreur avec Paperclip/FasterCSV Traitement pour le téléchargement csv optionnel
- 8. Utilisation de BeginInvoke/EndInvoke dans un mode multithread. Comment AsyncCallback, AsyncWaitHandle et IsCompleted interagissent-ils?
- 9. Comment puis-je empêcher définitivement Excel de configurer tous les nouveaux documents en mode R1C1?
- 10. Pourquoi traceback.extract_stack() renvoie [] quand il y a définitivement une pile d'appels?
- 11. Qui ajoute les définitions de méthode BeginInvoke, Invoke et EndInvoke à un délégué typé?
- 12. Comment puis-je sauvegarder définitivement les fichiers AVAudioRecorder pour un accès ultérieur?
- 13. Expression régulière pour faire correspondre les nombres entre parenthèses entre crochets avec le texte optionnel
- 14. Regex pour capturer un groupe optionnel au milieu d'un bloc d'entrée
- 15. Comment déclarer un élément non-chaîne comme ayant un contenu optionnel dans le schéma XML
- 16. Comment ajouter un paramètre optionnel/valeur par défaut dans la fonction VB?
- 17. Comment puis-je définir un paramètre facultatif en PHP après le premier paramètre optionnel
- 18. Comment est-ce que je peux éviter de passer/stocker un délégué en utilisant BeginInvoke et EndInvoke?
- 19. Problème dans le développement du plug-in: Eclipse 3.4 ne trouve pas de bundle qui soit définitivement là!
- 20. Génération de classes Spring SP avec ou sans Eclipse
- 21. Webservice ou WCF ou quoi
- 22. NHibernate ou FluentNHibernate ou ActiveRecord?
- 23. yahoo-pipes ou plugin ou quelque chose ...
- 24. Pylônes ou TurboGears vs .NET ou Java
- 25. Que se passe-t-il lorsqu'un ouvrier Apache démarre son propre thread ou processus de travail?
- 26. C# fichier d'impression selon PDF ou Excel ou Word ou un fichier bloc-notes Modèle
- 27. Choix d'une plate-forme C#/MsSql ou Php/Mysql ou JSP ou quoi?
- 28. Étirer l'image verticalement soit en utilisant javascript ou Jquery
- 29. Client .NET ou ActiveX (ou une autre approche?)
- 30. Accéder aux applications Mac depuis Ruby ou PHP ou Cocoa
Vous pouvez également voir http://marcgravell.blogspot.com/2009/02/async-without-pain.html –