J'ai créé une bibliothèque de classes qui fait du géotraitement. L'addin appelle une classe qui est un processus asynchrone. Je me suis assuré que le thread est STA et que les arcobjects sont thread-safe (c'est-à-dire non transmis depuis l'addin). Tous les arcobjects sont créés dans le fil.
Parce que c'est une bibliothèque de classes, je l'ai enveloppée dans une interface utilisateur winforms et également en tant que complément. Les deux ensembles de codes sont exactement les mêmes et les tests ont été effectués en utilisant exactement les mêmes données. Les winforms et le complément complètent le code avec les résultats souhaités et aucune fuite de mémoire n'est évidente. Pour le cas de l'addin, il n'y a pas d'interaction avec la période de carte à ce stade et il n'y a pas non plus d'éléments de mappage ou d'affichage dans le code winforms.
les seules mises à jour de l'interface utilisateur sont la mise à jour d'une boîte de dialogue de progression dans le complément et l'interface utilisateur. L'addin utilise une fenêtre ancrable (contrôle utilisateur ui).
Le problème que je vois est lorsque la bibliothèque est appelée à partir du complément, l'exécution du code est 5 fois plus lente que le même code appelé via l'application winforms.
Des idées sur où je pourrais chercher pour voir pourquoi cela se produit?
la source
Activator.CreateInstance
ou avecnew
?Réponses:
Lorsque vous comparez les deux versions, il se peut que vous programmiez plus que le temps de géotraitement.
Il existe peut-être des procédures d'initialisation en cours d'exécution dans votre application autonome qui sont déjà effectuées dans ArcMap au démarrage, par exemple la création d'un objet MxDocument, le retrait de la licence, la création de GDB scratch, etc.
Il pourrait également y avoir une différence entre la version de .NET Framework utilisée dans ArcMap et votre application de bureau (même si je ne vois pas cela provoquer un ralentissement 5x).
la source