Как использовать GC.KeepAlive () и для каких целей? - PullRequest
12 голосов
/ 03 сентября 2011

Как использовать GC.KeepAlive() и для каких целей?

Я передаю файл с терминала (Windows-CE) на сервер, используя Socket. Время, необходимое для передачи, составляет 8 минут. Через 5 минут выключение Windows-CE (если сенсорный экран не нажат)

Если я использую GC.KeepAlive() для этого, это моя проблема?

Ответы [ 3 ]

13 голосов
/ 03 сентября 2011

Вам очень редко нужно использовать GC.KeepAlive - очень редко.Например, вы будете использовать его, если хотите предотвратить побочный эффект финализатора слишком рано.Я чаще всего видел, что он используется для Mutex - поддержание мьютекса в действии до конца приложения, чтобы убедиться, что есть только один экземпляр.(На самом деле утверждение using здесь лучше, но это отдельный вопрос.)

И нет, это не похоже на то, что оно уместно в вашей ситуации.

4 голосов
/ 03 сентября 2011

Из библиотеки MSDN для .NET:

Целью метода KeepAlive является обеспечение существования ссылка на объект, который подвергается риску преждевременного восстановления у сборщика мусора. Распространенный сценарий, в котором это может произойти, когда нет ссылок на объект в управляемом коде или данных, но объект все еще используется в неуправляемом коде, таком как Win32 API, неуправляемые библиотеки DLL или методы, использующие COM.

Так что не это не решило бы вашу проблему. На самом деле это даже не связано с вашей проблемой. Единственное, что вы можете сделать, - это запустить службу / приложение в Windows CE, добавив код, который предотвращает отключение системы до тех пор, пока идет передача

0 голосов
/ 04 сентября 2011

Выключение экрана - это настройка управления питанием на устройстве.Это произойдет независимо от того, запущено приложение или нет.GC не имеет к этому никакого отношения.

Если вы не хотите, чтобы источник питания перевел устройство в режим низкого энергопотребления, у вас есть несколько вариантов.Вы можете периодически вызывать SystemIdleTimerReset в своем приложении.

Вы можете принудительно настроить состояние питания с помощью SetSystemPowerState .

Вы можете изменить тайм-ауты диспетчера электропитания на более подходящие для вас, изменив настройки на [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power\Timeouts] (за которым следует трансляция WM_SETTINGS_CHANGE IIRC).

Лучшее «решение» будет зависетьо требованиях вашего приложения, требованиях ваших пользователей и системе управления питанием целевого устройства.

...