ArcObjects in esecuzione in Addin più lentamente?


9

Ho creato una biblioteca di classe che esegue alcuni geoprocessing. Il componente aggiuntivo chiama una classe che è un processo asincrono. Ho assicurato che il thread è STA e gli oggetti arco sono thread-safe (cioè non passati dall'addin). Tutti gli oggetti arco vengono creati all'interno del thread.

Poiché questa è una libreria di classi, l'ho racchiusa in un'interfaccia utente di winforms e anche come componente aggiuntivo. Entrambi gli insiemi di codice sono esattamente gli stessi e il test è stato eseguito utilizzando esattamente gli stessi dati. Sia le winform che l'aggiunta completano il codice con i risultati desiderati e non sono evidenti perdite di memoria. Per il caso del componente aggiuntivo non vi è alcuna interazione con il periodo della mappa a questo punto e non ci sono neppure elementi di mappatura o di visualizzazione nel codice winforms.

gli unici aggiornamenti dell'interfaccia utente sono l'aggiornamento di una finestra di dialogo di avanzamento sia nel componente aggiuntivo che nell'interfaccia utente. Il componente aggiuntivo utilizza una finestra agganciabile (interfaccia utente controllo utente).

Il problema che sto vedendo è quando la libreria viene chiamata dal componente aggiuntivo, l'esecuzione del codice è 5 volte più lenta dello stesso codice chiamato tramite l'applicazione winforms.

Qualche idea su dove potrei guardare per vedere perché questo sta accadendo?


Stai usando dei singleton arcobjects ?
Kirk Kuykendall,

Sì, una rapida occhiata all'elenco e sto usando alcuni oggetti factory workspace per aprire i miei occhiali indipendenti da ArcMap in modo che vengano creati all'interno del thread. Sto creando due factory di spazio di lavoro (per i miei input e output), quindi eseguendo il loop e il caching dei dati localmente utilizzando uno spazio di lavoro inmemmory che uso una fabbrica per creare. Devo creare la memoria spazio di lavoro solo una volta? Dovrei menzionare che il codice non fallisce ed è lento solo quando eseguito all'interno del componente aggiuntivo.
Justin Carasick,

Stai creando usando Activator.CreateInstanceo con new?
Kirk Kuykendall,

Sto (o stavo) usando il nuovo. Sto aggiornando ora per provare il metodo Activator.CreateInstance.
Justin Carasick,

Ho aggiornato il codice (grazie per averlo sottolineato) ma non vedo una vera differenza con l'aggiornamento.
Justin Carasick,

Risposte:


1

Quando si confrontano entrambe le versioni, è possibile che il tempo non sia solo il tempo di geoprocessing.

Forse ci sono alcune procedure di inizializzazione in esecuzione nell'applicazione standalone che sono già eseguite in ArcMap all'avvio, ad es. Creazione di oggetti MxDocument, checkout delle licenze, creazione di scratch GDB, ecc.

Potrebbe esserci anche una differenza nella versione di .NET Framework utilizzata in ArcMap e nell'applicazione desktop (anche se non vedo che ciò causi un rallentamento di 5x).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.