2011-09-03 13 views
9

cómo usar GC.KeepAlive() y con qué propósito?cómo usar GC.KeepAlive() y con qué propósito

transfiero el archivo del terminal (Windows-CE) al servidor usando Socket.

el tiempo que debe transferirse es de 8 minutos.

después de 5 minutos, el Windows CE de parada de (si la pantalla táctil no presionado)

si uso GC.KeepAlive() para esto, es que a resolver mi problema?

gracias de antemano

+0

¿Intentó usar esa API? Según MSDN, parece verdadero o podría funcionar dado que WinCE está en código no administrado – Zenwalker

Respuesta

4

de la biblioteca MSDN para .NET:

El propósito del método de KeepAlive es asegurar la existencia de una referencia a un objeto que está en riesgo de ser prematuramente reclamado por el recolector de basura. Un escenario común en el que esto podría suceder es cuando no hay referencias al objeto en código administrado o datos, pero el objeto todavía está en uso en código no administrado como Win32 APIs, DLL no administradas o métodos que usan COM.

Por lo tanto, esto no solucionaría su problema. De hecho, ni siquiera está relacionado con tu problema. La única cosa que puede hacer es en el servicio/aplicación que se ejecuta en el Windows CE, añadiendo código que impide que el sistema se apague mientras la transferencia está en progreso

+0

¿Los artículos de wince son objetos no administrados? Entonces, según MSDN, es verdad ¿verdad? – Zenwalker

+1

El hecho de que esté ejecutando en Windows CE no significa que no esté administrado, ya que hay una plataforma .NET completa disponible para dispositivos específicos de CE –

+0

Puede ser si se supone que se estremece sin control. Entonces keepalive wud ser útil? – Zenwalker

11

Es muy rara vez se necesita usar GC.KeepAlive-muy raramente. Lo usaría si quisiera evitar que el efecto secundario de un finalizador ocurra demasiado pronto, por ejemplo. Lo he visto más a menudo usado para Mutex, manteniendo vivo el mutex hasta el final de una aplicación para asegurarme de que solo haya una instancia. (Una declaración using es en realidad mejor aquí, pero eso es un asunto aparte.)

Y no, no parece que sea relevante en su caso.

+1

Según MSDN, wince están en objetos no administrados. Entonces, para que sea persistente, lo que dice msdn es cierto aquí, ¿verdad? – Zenwalker

+1

@zenwalker: CE admite ambos códigos administrado y nativo, aunque ninguno es relevante para el problema en cuestión. – ctacke

+0

¿Qué pasa con los objetos COM? – codea

0

La pantalla que se está apagando es una configuración de administración de energía en el dispositivo. Va a suceder independientemente de si se está ejecutando alguna aplicación. El GC no tiene absolutamente nada que ver con esto.

Si desea evitar que el generador de energía coloque su dispositivo en un estado de bajo consumo de energía, tiene algunas opciones. Puede llamar periódicamente al SystemIdleTimerReset en su aplicación.

Puede forzar el estado de alimentación a algo que desee con SetSystemPowerState.

Puede cambiar los tiempos de espera del administrador de energía a algo más de su agrado ajustando la configuración en [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power\Timeouts] (seguido de un WM_SETTINGS_CHANGE broadcast IIRC).

La mejor "solución" dependerá de los requisitos de su aplicación, los requisitos de los usuarios y el sistema de administración de energía del dispositivo de destino.

Cuestiones relacionadas