2011-09-03 14 views
9

come utilizzare GC.KeepAlive() e per quale scopo?come utilizzare GC.KeepAlive() e per quale scopo

trasferire il file dal terminale (Windows-CE) al server tramite socket.

il tempo necessario per il trasferimento è 8 minuti.

dopo 5 minuti di Windows CE-shut-down (se touch screen non premuto)

se io uso GC.KeepAlive() per questo, è risolvere il mio problema?

grazie in anticipo

+0

Hai provato a utilizzare quell'API? Come da MSDN, sembra vero o potrebbe funzionare dato che WinCE si trova su un codice non gestito – Zenwalker

risposta

4

Dalla libreria MSDN per NET:

Lo scopo del metodo KeepAlive è garantire l'esistenza di un riferimento a un oggetto che è a rischio di essere prematuramente recuperato dal garbage collector. Uno scenario comune in cui ciò potrebbe accadere è quando non ci sono riferimenti all'oggetto nel codice gestito o nei dati, ma l'oggetto è ancora in uso in codice non gestito come API Win32, DLL non gestite o metodi che utilizzano COM.

Quindi non questo non risolverebbe il tuo problema. In realtà non è nemmeno legato al tuo problema. L'unica cosa che si può fare è al servizio/applicazione in esecuzione su Windows CE, l'aggiunta di codice che impedisce al sistema di arresto fino a quando il trasferimento è in corso

+0

I wince stuffs sono oggetti non gestiti? Così come per MSDN, è vero vero? – Zenwalker

+1

Solo perché è in esecuzione su Windows CE non significa che non è gestito, in quanto è disponibile un'intera piattaforma .NET per i dispositivi CE specifici –

+0

Può essere se si presume che esegua una virata su unamanged. Allora il keepalive sarà utile? – Zenwalker

11

È molto raramente bisogno di usare GC.KeepAlive-molto raramente. Lo useresti se volessi impedire che l'effetto collaterale di un finalizzatore si verifichi troppo presto, ad esempio. L'ho visto più spesso con lo standard Mutex - mantenendo attivo il mutex fino alla fine di un'app per verificare che ci sia solo un'istanza. (Un'istruzione using è effettivamente migliore qui, ma è una questione separata.)

E no, non sembra rilevante per la tua situazione.

+1

Come da MSDN, i segnali di errore sono su oggetti non gestiti. Quindi, per renderlo persistente ciò che dice msdn è vero qui, giusto? – Zenwalker

+1

@zenwalker: CE supporta entrambi i codici gestito e nativo, sebbene nessuno dei due sia rilevante per il problema in questione. – ctacke

+0

E gli oggetti COM? – codea

0

Lo schermo che si spegne è un'impostazione di risparmio energetico sul dispositivo. Sta per succedere che qualsiasi app sia in esecuzione o meno. Il GC non ha assolutamente nulla a che fare con questo.

Se si desidera impedire che il potere di alimentazione metta il dispositivo in uno stato di bassa potenza, sono disponibili alcune opzioni. Puoi periodicamente chiamare SystemIdleTimerReset nella tua app.

È possibile forzare lo stato di alimentazione a qualcosa che ti piace con SetSystemPowerState.

È possibile modificare i timeout del gestore di potenza in qualcosa di più di vostro gradimento regolando le impostazioni su [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power\Timeouts] (seguito da un IIRC broadcast WM_SETTINGS_CHANGE).

La migliore "soluzione" dipenderà dai requisiti dell'app, dai requisiti degli utenti e dal sistema di gestione dell'alimentazione del dispositivo di destinazione.

Problemi correlati