ArcObjects działa wolniej w Addin?

9

Stworzyłem bibliotekę klas, która wykonuje geoprzetwarzanie. Dodatek wywołuje klasę, która jest procesem asynchronicznym. Upewniłem się, że wątek jest STA, a obiekty Arc są bezpieczne dla wątków (tzn. Nie zostały przekazane z dodatku). Wszystkie obiekty łukowe są tworzone w wątku.

Ponieważ jest to biblioteka klas, zawarłem ją w interfejsie użytkownika winforms, a także jako dodatek. Oba zestawy kodu są dokładnie takie same, a test został przeprowadzony przy użyciu dokładnie tych samych danych. Zarówno winforms, jak i addin uzupełniają kod z pożądanymi wynikami i nie są widoczne żadne wycieki pamięci. W przypadku dodatku nie ma w tym momencie interakcji z okresem mapy i nie ma elementów mapowania ani wyświetlania w kodzie winforms.

jedynymi aktualizacjami interfejsu użytkownika są aktualizacja okna dialogowego postępu zarówno w dodatku, jak i interfejsie użytkownika. Dodatek korzysta z dokowalnego okna (interfejs użytkownika).

Problem, który widzę, polega na tym, że biblioteka jest wywoływana z dodatku, wykonywanie kodu jest 5 razy wolniejsze niż ten sam kod wywoływany przez aplikację winforms.

Wszelkie pomysły na to, gdzie mogę sprawdzić, dlaczego tak się dzieje?

Justin Carasick
źródło
Czy używasz singletonów Arcobjects ?
Kirk Kuykendall
Tak, szybkie spojrzenie na listę i korzystam z kilku obiektów przestrzeni roboczej, aby otworzyć moje klasy obiektów niezależnie od ArcMap, aby zostały utworzone w wątku. Tworzę dwa przestrzenie robocze (dla danych wejściowych i wyjściowych), a następnie lokalnie zapętlam i buforuję dane za pomocą obszaru pamięci, który używam do tworzenia w fabryce. Czy powinienem utworzyć pakiet pamięciowy tylko raz? Powinienem wspomnieć, że kod nie zawodzi i jest powolny tylko wtedy, gdy jest wykonywany w dodatku.
Justin Carasick
Czy tworzysz za pomocą Activator.CreateInstanceczy z new?
Kirk Kuykendall
Używam (lub używałem) nowego. Aktualizuję się teraz, aby wypróbować metodę Activator.CreateInstance.
Justin Carasick
Zaktualizowałem kod (dzięki za wskazanie tego), ale nie widzę prawdziwej różnicy w aktualizacji.
Justin Carasick

Odpowiedzi:

1

Porównując obie wersje, możesz mierzyć więcej niż tylko czas geoprzetwarzania.

Być może w twojej samodzielnej aplikacji są uruchomione pewne procedury inicjalizacji, które są już wykonywane w ArcMap podczas uruchamiania, np. Utworzenie obiektu MxDocument, sprawdzenie licencji, utworzenie scratch GDB itp.

Może również występować różnica w wersji .NET Framework używanej w ArcMap i twojej aplikacji komputerowej (chociaż nie widzę, aby powodowało to 5-krotne spowolnienie).

Berend
źródło