¿ArcObjects se ejecuta en Addin más lento?

9

He creado una biblioteca de clases que hace un poco de geoprocesamiento. El complemento llama a una clase que es un proceso asíncrono. Me he asegurado de que el hilo sea STA y los arcobjects sean seguros para el hilo (es decir, no pasaron del complemento). Todos los arcobjects se crean dentro del hilo.

Debido a que esta es una biblioteca de clase, la envolví en una interfaz de usuario winforms y también como un complemento. Ambos conjuntos de código son exactamente iguales y la prueba se realizó utilizando exactamente los mismos datos. Tanto el winforms como el complemento completan el código con los resultados deseados y no hay pérdidas de memoria evidentes. Para el caso del complemento no hay interacción con el período del mapa en este punto y tampoco hay elementos de mapeo o visualización en el código winforms.

Las únicas actualizaciones de la interfaz de usuario son la actualización de un cuadro de diálogo de progreso tanto en el complemento como en la interfaz de usuario. El complemento está utilizando una ventana acoplable (ui de control de usuario).

El problema que veo es cuando se llama a la biblioteca desde el complemento, la ejecución del código es 5 veces más lenta que el mismo código llamado a través de la aplicación winforms.

¿Alguna idea sobre dónde podría mirar para ver por qué ocurre esto?

Justin Carasick
fuente
¿Está utilizando algún arcobjects singletons ?
Kirk Kuykendall
Sí, un vistazo rápido a la lista y estoy usando algunos objetos de fábrica del espacio de trabajo para abrir mis clases de entidades independientes de ArcMap para que se creen dentro del hilo. Estoy creando dos fábricas de espacio de trabajo (para mi entrada y salida) y luego haciendo un bucle y almacenando en caché los datos localmente usando un inmemmoryworkspace que utilizo una fábrica para crear. ¿Debo crear la inmemoryworkspacefactory solo una vez? Debo mencionar que el código no falla y es lento solo cuando se ejecuta dentro del complemento.
Justin Carasick
¿Estás creando usando Activator.CreateInstanceo con new?
Kirk Kuykendall
Estoy (o estaba) usando lo nuevo. Estoy actualizando ahora para probar el método Activator.CreateInstance.
Justin Carasick
Actualicé el código (gracias por señalarlo) pero no veo una diferencia real con la actualización.
Justin Carasick

Respuestas:

1

Al comparar ambas versiones, puede estar cronometrando más que solo el tiempo de geoprocesamiento.

Tal vez hay algunos procedimientos de inicialización que se ejecutan en su aplicación independiente que ya se realizaron en ArcMap en el inicio, por ejemplo, la creación del objeto MxDocument, el pago de la licencia, la creación de scratch GDB, etc.

También podría haber una diferencia en la versión de .NET Framework utilizada en ArcMap y su aplicación de escritorio (aunque no veo que eso cause una ralentización de 5x).

Berend
fuente