2012-07-13 15 views
12

Avevo pensato che quando si interrompe il debug (ad esempio premendo il pulsante Stop o premendo Shift + F5), qualsiasi classe che implementa un finalizzatore o IDisposable sarebbe, beh, smaltita.Esegui codice all'avvio del debugger VisualStudio

Ho alcune classi che implementano IDisposable. Ci sono alcune cose che vorrei (provare) e fare mentre l'applicazione esce dal debugger (o da crash in produzione). In questo momento, Dispose() non sembra essere chiamato, né un finalizzatore ~MyClass(){}

C'è un modo per fare questo?

+0

A meno che l'arresto anomalo non sia causato da un'eccezione intercettabile, non c'è alcuna garanzia che QUALSIASI codice venga eseguito dopo l'arresto anomalo. questa è la natura di un arresto anomalo dell'applicazione. Qualcosa è andato storto e ora il tuo processo è stato chiuso con la forza. –

+1

@Boo capito. Ma, se posso eseguire il codice sotto almeno un sottoinsieme degli scenari, lo prenderò. – CoolUserName

+0

Il pulsante di arresto nel debugger è uguale al sistema operativo che chiude l'app.È senza cerimonie e dannatamente improvvisa, senza riguardo per ciò che l'applicazione potrebbe essere in corso o che intende fare. –

risposta

2

Per l'arresto normale dei servizi Windows, è necessario inserire il codice nel metodo Stop.

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.stop.aspx

In generale, filo maleducato interrompe e maleducati singole discariche dominio applicazione non sta per eseguire finalizzatori 'normali' - è possibile ottenere ulteriori informazioni in questo articolo di MSDN.

https://web-beta.archive.org/web/20150423173148/https://msdn.microsoft.com/en-us/magazine/cc163716.aspx

Fino a questo punto, ho semplicemente parlato di filo interrompe come risultato del runtime gettare ThreadAbortException su un thread. In genere, ciò causerà la terminazione del thread. Tuttavia, un thread può gestire un'interruzione del thread, impedendogli di terminare il thread. Per tener conto di ciò, il runtime fornisce un'azione più potente, l'interruzione del thread maleducato con nome appropriato. Un interruzione di thread maleducato causa la cessazione dell'esecuzione di un thread. Quando ciò accade, il CLR non garantisce che venga eseguito alcun codice di back-out sul thread (a meno che il codice non sia in esecuzione in un CER). Scortese, davvero. Allo stesso modo, mentre uno scarico tipico del dominio dell'applicazione interrompe correttamente tutti i thread nel dominio, uno scaricamento del dominio dell'applicazione maleducato interromperà bruscamente tutti i thread nel dominio e non garantisce che i normali finalizzatori associati agli oggetti in quel dominio verranno eseguiti . SQL Server 2005 è un host CLR che fa uso di interruzioni di thread maleducati e di domini di applicazioni maleducati come parte del criterio di escalation. Quando si verifica un'eccezione asincrona, l'errore di allocazione delle risorse verrà aggiornato ad un'interruzione del thread. E quando si verifica un'interruzione del thread, se non termina in un intervallo di tempo impostato da SQL Server, verrà aggiornato a una interruzione di thread maleducata. Allo stesso modo, se un'operazione di scaricamento del dominio dell'applicazione non termina entro un intervallo di tempo impostato da SQL Server, verrà aggiornato a uno scortato dominio di applicazione. (Si noti che le politiche appena esposte non sono esattamente quelle utilizzate da SQL Server, in quanto SQL Server tiene anche conto del fatto che il codice sia in esecuzione in aree critiche, ma di più su questo argomento a breve).

1

Bene, il CLR non promette nulla in merito al momento in cui i vostri oggetti verranno raccolti o smaltiti.

È possibile provare a chiamare il garbage collector in modo esplicito, ma non credo che sia un approccio consigliato.

La cosa migliore da fare è utilizzare gli oggetti IDisposable all'interno di un blocco using.
Questo è l'unico momento in cui sei garantito quando verranno smaltiti.

+2

FWIW, 'using' è solo sintassi sugar per un try/finally, quindi non è più garantito di un normale blocco finally. –

+0

sì, è zucchero sintattico per try/finally (Dispose()). vedere qui: "L'istruzione using assicura che venga chiamato Dispose anche se si verifica un'eccezione durante il richiamo di metodi sull'oggetto, è possibile ottenere lo stesso risultato inserendo l'oggetto in un blocco try e quindi chiamando Dispose in un blocco finally". http://msdn.microsoft.com/en-us/library/yh598w02%28v=vs.100%29.aspx –

Problemi correlati