2011-09-03 28 views
9

jak używać GC.KeepAlive() iw jakim celu?jak korzystać z GC.KeepAlive() iw jakim celu

Przesłać plik z terminala (Windows-CE) na serwer przy użyciu gniazda.

czas potrzebny na przeniesienie to 8 minut.

po 5 minutach Windows CE shut-down (jeśli ekran dotykowy nie wciśnięty)

przypadku korzystania GC.KeepAlive() na to, czy to rozwiąże mój problem?

góry dzięki

+0

Czy próbowałeś używać tego interfejsu API? Jak na MSDN, wydaje się, prawda lub może działać, ponieważ WinCE są na niezarządzanym kodzie – Zenwalker

Odpowiedz

4

z biblioteki MSDN NET:

Celem metody keepalive jest zapewnienie istnienia odniesieniu do obiektu, który jest na ryzyko bycia przedwcześnie odzyskał przez śmieciarza. Typowym scenariuszem, w którym może się to zdarzyć, jest , gdy nie ma żadnych odniesień do obiektu w zarządzanym kodzie lub danych, , ale obiekt nadal jest używany w kodzie niezarządzanym, takim jak biblioteki DLL Win32, niezarządzanych bibliotek DLL lub metody używające COM.

To nie rozwiąże problemu. W rzeczywistości nie jest to nawet związane z twoim problemem. Jedyne co można zrobić to w usługi/aplikacji uruchomionych na Windows CE, dodając kod, który zapobiega system do zamykania tak długo jak przekazanie jest w toku

+0

Czy wince stuffs są niezarządzanego obiektu? Tak jak na MSDN, to prawda, prawda? – Zenwalker

+1

Tylko dlatego, że korzystasz z Windows CE, nie oznacza to, że jest niezarządzany, ponieważ istnieje cała platforma .NET dostępna dla urządzeń specyficznych dla CE –

+0

Może być, jeśli założyła, że ​​wahanie nie ulega zmianie. Czy keepalive będzie pomocny? – Zenwalker

11

Jesteś bardzo rzadko trzeba użyć GC.KeepAlive - bardzo rzadko. Używałbyś go, gdybyś chciał zapobiec efektowi ubocznemu finalizatora zbyt wcześnie, na przykład. Najczęściej widziałem, jak był używany do Mutex - utrzymywania muteksu przy życiu aż do końca aplikacji, aby upewnić się, że istnieje tylko jedno wystąpienie. (Oświadczenie using jest w rzeczywistości lepsze, ale to jest osobna sprawa.)

I nie, to nie brzmi tak, jak ma to znaczenie w twojej sytuacji.

+1

Zgodnie z MSDN, wince są na obiektach niezarządzanych. Tak więc, aby było to trwałe, to co mówi msdn, jest tutaj prawdziwe, prawda? – Zenwalker

+1

@zenwalker: CE obsługuje zarówno kod zarządzany, jak i natywny, ale żaden z nich nie jest odpowiedni dla problemu. – ctacke

+0

Co z obiektami COM? – codea

0

Wyłączenie ekranu to ustawienie zarządzania energią w urządzeniu. To się stanie, niezależnie od tego, czy aplikacja jest uruchomiona. GC absolutnie nie ma z tym nic wspólnego.

Jeśli chcesz zapobiec sytuacji, w której mauzoleum mocy może przełączyć urządzenie w stan niskiego poboru mocy, masz kilka opcji. Możesz okresowo dzwonić pod numer SystemIdleTimerReset w swojej aplikacji.

Możesz wymusić stan zasilania na coś, co ci się podoba pod numerem SetSystemPowerState.

Możesz zmienić limity czasu menedżera zasilania na coś bardziej podobnego do twoich potrzeb, zmieniając ustawienia na [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power\Timeouts] (a następnie IIRC transmisji WM_SETTINGS_CHANGE).

Najlepsze "rozwiązanie" będzie zależało od wymagań aplikacji, wymagań użytkowników i systemu zarządzania energią docelowego urządzenia.

Powiązane problemy