2009-06-16 10 views
5

Nie jestem pewien, czy tytuł pytanie jest najlepszy, ale to był najlepszy mogłem wymyślić ....NET Application bardzo powoli po długim okresie bezczynności

mam ten .NET (C#), które uruchamia się w systemie Windows i pozostaje otwarte, dopóki komputer nie zostanie wyłączony. Aplikacja pozostaje na tacy i otwieram ją, klikając ikonę tacy i zamykając ją w ten sam sposób.

Aplikacja początkowo nie działa, działa normalnie, bez problemów. Ale po długich okresach bezczynności sam staje się bardzo powolny, gdy po raz pierwszy pokazuje go po raz pierwszy od dłuższego czasu. Wiesz co mam na myśli.

Na przykład nie mogłem używać/otwierać (klikać ikony na pasku zadań) przez kilka dni i pomiędzy tymi dniami, kiedy otwierałem i zamykałem, a także używałem wielu innych aplikacji, także ciężkich aplikacji i prawdopodobnie hibernowałem i wznowiłem komputer kilka razy i kiedy musiałem ponownie otworzyć aplikację, była powolna. Po kilku minutach korzystania z niego wraca do normy i działa dobrze.

Wierzę, że ma to coś wspólnego z zarządzaniem pamięcią, a system prawdopodobnie zwalnia większość pamięci mojej aplikacji, aby inne programy mogły z niego korzystać wydajniej. A może zarządzanie pamięcią .NET jest z tym związane ...

Niezależnie od powodu, czy jest coś, co mogę zrobić, aby zoptymalizować moją aplikację pod kątem tego problemu?

Odpowiedz

10

Jest to prawie na pewno spowodowane przeniesieniem pamięci na dysk.

Po zaprzestaniu korzystania z aplikacji i innych aplikacji lub zadań zacznij wywierać nacisk na pamięć, strony pamięci z aplikacji mogą być zapisywane na dysku. Kiedy ponownie spróbujesz użyć aplikacji, wszystkie te dane muszą zostać odczytane, powodując pojawianie się straganów.

Niestety, nie ma dobrego rozwiązania - jeśli uruchomisz jako administrator lub masz SeLockMemoryPrivilege, możesz zablokować części aplikacji w pamięci fizycznej. Możesz okresowo "dotykać" stron, aby zachować je w pamięci fizycznej. Niestety, obie te opcje spowodują, że twoja aplikacja będzie źle współpracować z innymi aplikacjami w systemie - twoja pamięć jest stronicowana, ponieważ fizyczna pamięć jest potrzebna do czegoś innego. Możesz spróbować zmniejszyć ogólny rozmiar pamięci, ale nadal będziesz napotykał ten problem w niektórych przypadkach. Dostępne opcje korekty rozmiaru zestawu roboczego, ale system operacyjny może je zignorować i będzie w wielu przypadkach.

+0

Mam tylko nadzieję, że nie użyjesz tych technik w swoich aplikacjach. "Baw się dobrze z innymi" to moje motto. – GregC

+0

Nie ... jest kilka aplikacji, w których wymagany jest taki rodzaj kontroli. SQL Server na przykład, być może niektóre systemy wbudowane, w których muszą istnieć gwarancje responsywności i tak dalej. W przypadku zwykłych aplikacji klienckich to prawie nigdy nie jest dobry pomysł. – Michael

5

Możesz użyć .NET memory profiler, aby dobrze zrozumieć, co aplikacja robi z pamięcią na przestrzeni czasu. Możesz sprawdzić, czy coś się buduje tam, gdzie się tego nie spodziewasz (kolekcje, listy itd.) I co powoduje wzrost śladu pamięci.

+0

Daj mi szansę ... –

2

Czy próbowałeś dwukrotnie kliknąć w Eksploratorze procesów na uruchomionej aplikacji i obserwować, czy nie ma wycieków? Czy to wykorzystanie procesora, wyciek UI, wyciek pamięci, powtarzające się operacje we/wy?

+0

Gdzie mogę znaleźć, jeśli coś przecieka? Nie mogłem znaleźć nigdzie informacji w eksploratorze procesów ... –

+0

Wymaga to obserwacji przez pewien czas. Jeśli licznik pamięci obiektu lub licznika stale rośnie, występuje przeciek. – GregC

0

Uważam, że takie zachowanie jest normalne w systemie Windows. System Windows będzie obsługiwał najbardziej potrzebną aplikację, tj. Aplikację, która jest aktualnie używana. Tak więc, jeśli aplikacja jest zminimalizowana lub nie jest aktywna przez dłuższy czas, tak jak w przypadku określonym powyżej, będzie najlepszym kandydatem do systemu Windows na udostępnienie pamięci aplikacji i udostępnienie pamięci aktywnej aplikacji. System Windows przywróci pamięć aplikacji po jej uruchomieniu z pamięci stronicowania (dysku twardego), co wyjaśnia, dlaczego jest wolna.

To może nie być najlepsza odpowiedź, ale gdybym był tobą, eksperymentuję, zwiększając podstawowy priorytet aplikacji. Można to zrobić za pomocą obiektu Thread w strukturze .NET.

Dzięki.

+2

Nie jestem pewien, czy zwiększenie priorytetu to najlepszy sposób działania - brzmi to jak aplikacja w tle, więc posiadanie pierwszeństwa nad innymi aplikacjami na pierwszym planie wydaje mi się złym pomysłem. Wszystko zależy od tego, jak ważna jest aplikacja. –

0

To nie jest podstawowa odpowiedź ani rozwiązanie, ale jeśli Michael ma rację i nie ma na co naprawdę w tej sprawie nic zrobić, to możesz po prostu rozważyć wizualne poinformowanie użytkownika, że ​​aplikacja jest aktywna z paskiem postępu lub ładne koło postępu.

Nie przyspieszy to Twojego programu, ale może nieco ułatwić życie Twoim użytkownikom.

1

Jeśli problem polega na tym, że program jest wywoływany z powodu dłuższego okresu bezczynności, czy próbowałeś ustawić timer "podtrzymywania aktywności", który jest uruchamiany co kilka minut, który zasadniczo utrzymuje aplikację w stanie gdzie system przywoławczy nigdy nie postrzega go jako bezczynnego?

+0

Co by zrobił ten timer po uruchomieniu? Nic? Czy coś wyjątkowego? –

+0

Wąchałem, że to może wymagać trochę eksperymentów. Jeśli ma to działanie "no-op", utrzymuje aplikację jako stronicującą jako nieaktywną, to powinno wystarczyć. –

+0

Nie jestem pewien, co masz na myśli mówiąc "wykonuj operacje bezczynne" ... –

Powiązane problemy