ArcObjects laufen im Addin langsamer?

9

Ich habe eine Klassenbibliothek erstellt, die Geoverarbeitung durchführt. Das Add-In ruft eine Klasse auf, die ein asynchroner Prozess ist. Ich habe sichergestellt, dass der Thread STA ist und die ArcObjects threadsicher sind (dh nicht vom Addin übergeben werden). Alle Bogenobjekte werden innerhalb des Threads erstellt.

Da dies eine Klassenbibliothek ist, habe ich sie in eine Winforms-Benutzeroberfläche und auch als Add-In eingebunden. Beide Codesätze sind genau gleich und der Test wurde mit genau den gleichen Daten durchgeführt. Sowohl die Winforms als auch das Add-In vervollständigen den Code mit den gewünschten Ergebnissen, und es sind keine Speicherlecks erkennbar. Für den Fall des Add-Ins gibt es zu diesem Zeitpunkt keine Interaktion mit dem Map-Zeitraum und es gibt auch keine Mapping- oder Anzeigeelemente im Winforms-Code.

Die einzigen UI-Updates sind die Updates eines Fortschrittsdialogs sowohl im Add-In als auch in der UI. Das Add-In verwendet ein andockbares Fenster (Benutzersteuerungs-Benutzeroberfläche).

Das Problem, das ich sehe, ist, wenn die Bibliothek vom Add-In aufgerufen wird, die Codeausführung 5x langsamer ist als der gleiche Code, der über die Winforms-Anwendung aufgerufen wird.

Irgendwelche Ideen, wo ich nachsehen könnte, warum dies geschieht?

Justin Carasick
quelle
Verwenden Sie Singletons für Arcobjects ?
Kirk Kuykendall
Ja, ein kurzer Blick auf die Liste und ich verwende einige Workspacefactory-Objekte, um meine Feature-Classes unabhängig von ArcMap zu öffnen, damit sie im Thread erstellt werden. Ich erstelle zwei Arbeitsbereichsfabriken (für meine Eingabe und Ausgabe) und schleife und speichere Daten lokal mithilfe eines Inmemmory-Arbeitsbereichs, den ich in einer Factory erstelle. Sollte ich die Inmemoryworkspacefactory nur einmal erstellen? Ich sollte erwähnen, dass der Code nicht fehlschlägt und nur langsam ist, wenn er innerhalb des Add-Ins ausgeführt wird.
Justin Carasick
Erstellen Sie mit Activator.CreateInstanceoder mit new?
Kirk Kuykendall
Ich benutze (oder war) das Neue. Ich aktualisiere jetzt, um die Activator.CreateInstance-Methode zu testen.
Justin Carasick
Ich habe den Code aktualisiert (danke, dass Sie darauf hingewiesen haben), sehe aber keinen wirklichen Unterschied zum Update.
Justin Carasick

Antworten:

1

Wenn Sie beide Versionen vergleichen, planen Sie möglicherweise mehr als nur die Geoverarbeitungszeit.

Möglicherweise werden in Ihrer eigenständigen Anwendung einige Initialisierungsverfahren ausgeführt, die bereits beim Start in ArcMap ausgeführt werden, z. B. das Erstellen eines MxDocument-Objekts, das Auschecken von Lizenzen, das Erstellen von Scratch-GDB usw.

Es kann auch einen Unterschied zwischen der in ArcMap und Ihrer Desktop-Anwendung verwendeten .NET Framework-Version geben (obwohl ich nicht sehe, dass dies zu einer 5-fachen Verlangsamung führt).

Berend
quelle