Domanda

Ho bisogno di eseguire una porzione di codice (lo stato Salva) sul processo di arresto -. Per sé, per utente, per task manager, etc

E 'possibile?

try {} finally {}, AppDomain.ProcessExit, IDisposable, distruttore, .. cosa successiva per provare?

È stato utile?

Soluzione

Come altri hanno già fuori a punta, non c'è modo è possibile eseguire qualsiasi codice dell'applicazione quando viene Killed da Operating System o User. Ecco perché la sua chiamata Killing.

Se il salvataggio dello stato è una parte importante della vostra applicazione, si dovrebbe prendere un approccio simile a un sistema di database. Implementazione transaction log, creando checkpoints, ecc Questo è il più vicino si può ottenere.

In questo caso, quando i vostri rivive applicazione (è rieseguire dopo essere stato killed), esso può controllare questi transaction logs per eventuali aggiornamenti o modifiche in sospeso ultimo stato.

Oltre a questo, in realtà dipende da cosa si vuole fare. E anche per questo che si è venuta questa idea? Possiamo avere maggiori dettagli? Può essere che qualcuno qui ha un'alternativa migliore.

Altri suggerimenti

Il punto centrale di un essere ucciso processo ungracefully è che si ferma solo quello che sta facendo. Non posso davvero vedere un modo per aggirare questo.

È necessario riflettere sul perché il programma verrà chiuso. Se è a causa di un errore, quindi è possibile utilizzare try / catch. In termini unix, cosa succede quando il gestore del processo ferma un processo è una preda (cioè invia un segnale SIGKILL), che pretende molto consentire al programma di fare qualcosa prima che il processo si esce. Cosa molti virus fare è avere due processi (eventualmente con memoria condivisa per evitare la sincronizzazione dei dati costante), ogni monitoraggio dello stato dell'altro e quando si scende, gli altri respawns esso. Forse un secondo processo potrebbe monitorare e salvare lo stato in un modo simile per il vostro caso. L'altro tipo di segnale è però un SIGTERM. Questo segnale viene inviato quando si dice il riavvio del computer, ma ci sono i processi in esecuzione. Il kernel permette ai programmi per cercare di uscire da soli, ma alla fine chiederà all'utente se va bene per uccidere il programma. Se si desidera gestire ricerca SIGTERM gestione dei segnali. In definitiva l'unica soluzione che io sappia al SIGKILL è la soluzione dei due processi.

I si guardava intorno per un motivo un po 'diverso rispetto a quello che viene pubblicato, ma mi si avvicinò con una soluzione abbastanza buona per me e potrebbe utile a stato qui:

. NOTA: Per coloro che sanno cosa sia, questo è essenzialmente il modello di progettazione 'Heartbeat'

1) In aggiunta al codice in esecuzione che la volontà 'die' (ossia uccisi), codice metti in questo progetto tale che genera un filo (o forse un altro metodo?) All'inizializzazione, e tutto il filo non viene eseguito un infinito ciclo while (ma assicurarsi che dorme almeno un paio di secondi o addirittura 1 minuto tra iterazioni) e nel ciclo while, registrare un indicatore per indicare la tua app è 'vivo' (vale a dire il 'battito'). Io personalmente raccomando impostando un valore in entrambi i DB, o forse un file, che è il timestamp corrente (cioè DateTime.Now)

2) Ora che si sta registrando il 'battito cardiaco', creare un'altra applicazione (ad esempio un altro processo), che non fa altro che legge il valore del battito cardiaco (ovvero il timestamp corrente) e lo fa in un infinito ciclo while. Una volta che il suo determinato che il valore del battito cardiaco è 'cattivo' (vale a dire forse se, per esempio, HeartBeatTimestamp + 5 min

Spero che questo aiuti :) Non esitate a ricerca modello di progettazione del 'Heartbeat' da altre risorse per se volete saperne di più!

Saluti,

Jeff

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top