qual è la differenza tra Environment.Exit () e Application.Shutdown ()?

A volte l’applicazione non può uscire quando ho chiamato Application.Shutdown , l’interfaccia utente è stata chiusa, ma il processo è ancora in esecuzione. come chiudere l’applicazione con chiudere tutti i thread? ambiente.Exit () potrebbe chiudere tutto il thread? o dovremmo chiamare l’API Win32 TerminateThread per farlo?

Environment.Exit () è un modo più brutale di chiudere la tua applicazione sì, ma in generale se hai bisogno di uccidere la tua applicazione per chiuderla, allora penso che stai esaminando il problema nel modo sbagliato. Dovresti piuttosto guardare perché gli altri thread non si chiudono con grazia?

È ansible esaminare l’ evento FormClosing nel modulo principale e chiudere tutte le risorse che bloccano l’applicazione impedendone la chiusura.

Ecco come ho trovato le risorse per appendere l’app.

  1. In modalità debug abilita la visualizzazione dei thread (Questo ti permetterà di vedere tutti i thread che stai usando)
  2. Chiudi l’applicazione nel modo in cui non si chiude correttamente.
  3. Premere pausa in Visual Studio
  4. Guarda l’elenco dei thread e fai clic su di essi per vedere dove sono appesi il codice, ora che puoi vedere quali risorse stanno bloccando la tua applicazione dalla chiusura vai al tuo evento FormClosing e chiudi / Dispose lì.
  5. Ripeti fino a quando l’app non si chiude correttamente 🙂

Tieni presente che l’elenco dei thread in modalità di debug mostrerà alcuni thread che vengono eseguiti ma non sotto il tuo controllo, raramente questi thread hanno un nome e quando fai clic su di essi viene visualizzato un messaggio che dice che non hai simboli. Questi possono essere ignorati

Uno dei motivi per assicurarsi che la tua applicazione si stia chiudendo con grazia è che se alcune risorse (diciamo un FileStream ) non funzionano, quindi usare un po ‘di API per forzarlo a fare in fretta può far sì che arrivino tutti i tipi di problemi “casuali”, come impostazioni / file di dati non scritti e così via.

  1. Non dovresti MAI chiamare TerminateThread
  2. Assicurati che tutti i thread che hai generato siano contrassegnati come sfondo, in questo modo quando chiudi l’applicazione non attenderà il loro completamento.

Come ha detto Shay, NON chiamare mai TerminateThread, TerminateThread uccide solo un thread senza lasciarlo ripulire dopo di sé questo può portare a deadlock e corruzioni in altri thread nel processo.

TerminateProcess sull’altro ha ucciso l’intero processo e ha permesso al sistema di ripulire il sistema, è il modo più veloce per chiudere un processo: basta assicurarsi che non si disponga di risorse che il sistema operativo non può ripulire (aiuta anche a chiudi Windows prima di chiamare TerminateProcess).

Penso, ma non ho controllato, che Environemnt.Exit chiama TerminateProcess.

Application.Shutdown è molto diverso, non uccide immediatamente il processo: invia tutte le notifiche di chiusura e di chiusura e attende che tutte le windows e i thread dell’applicazione si chiudano.