Questo è qualcosa che ho scoperto solo pochi giorni fa, ho ottenuto la conferma che non è solo limitato alla mia macchina da questa domanda .
Il modo più semplice per riproporlo è avviando un'applicazione Windows Form, aggiungi un pulsante e scrivi questo codice:
private void button1_Click(object sender, EventArgs e) {
MessageBox.Show("yada");
Environment.Exit(1); // Kaboom!
}
Il programma ha esito negativo dopo l'esecuzione dell'istruzione Exit (). Su Windows Form viene visualizzato "Errore durante la creazione dell'handle della finestra".
L'abilitazione del debug non gestito rende in qualche modo chiaro cosa sta succedendo. Il ciclo modale COM è in esecuzione e consente di recapitare un messaggio WM_PAINT. È fatale in una forma eliminata.
Gli unici fatti che ho raccolto finora sono:
- Non si limita solo all'esecuzione con il debugger. Anche questo fallisce senza uno. Anche piuttosto male, la finestra di dialogo di arresto anomalo WER viene visualizzata due volte .
- Non ha nulla a che fare con il testimone del processo. Il livello wow64 è piuttosto noto, ma una build AnyCPU si blocca allo stesso modo.
- Non ha nulla a che fare con la versione .NET, 4.5 e 3.5 si bloccano allo stesso modo.
- Il codice di uscita non ha importanza.
- Chiamare Thread.Sleep () prima di chiamare Exit () non lo risolve.
- Ciò accade sulla versione a 64 bit di Windows 8 e Windows 7 non sembra essere interessato allo stesso modo.
- Questo dovrebbe essere un comportamento relativamente nuovo, non l'ho mai visto prima. Non vedo aggiornamenti pertinenti forniti tramite Windows Update , sebbene la cronologia degli aggiornamenti non sia più accurata sul mio computer.
- Questo è un comportamento gravemente sconvolgente. Scriveresti codice come questo in un gestore eventi per AppDomain.UnhandledException e si arresta in modo anomalo allo stesso modo.
Sono particolarmente interessato a cosa potresti eventualmente fare per evitare questo incidente. In particolare lo scenario AppDomain.UnhandledException mi sorprende; non ci sono molti modi per terminare un programma .NET. Si noti che la chiamata a Application.Exit () o Form.Close () non è valida in un gestore eventi per UnhandledException, quindi non sono soluzioni alternative.
AGGIORNAMENTO: Mehrdad ha sottolineato che il thread del finalizzatore potrebbe essere parte del problema. Penso che sto vedendo questo e sto anche vedendo alcune prove per il timeout di 2 secondi che il CLR fornisce al thread del finalizzatore per terminare l'esecuzione.
Il finalizzatore si trova all'interno di NativeWindow.ForceExitMessageLoop (). C'è una funzione IsWindow () Win32 lì che corrisponde approssimativamente alla posizione del codice, offset 0x3c quando si guarda il codice macchina in modalità 32-bit. Sembra che IsWindow () sia un deadlock. Tuttavia, non riesco a ottenere una buona traccia dello stack per gli interni, il debugger pensa che la chiamata P / Invoke sia appena tornata. Questo è difficile da spiegare. Se riesci a ottenere una traccia dello stack migliore, mi piacerebbe vederlo. Il mio:
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.ForceExitMessageLoop() + 0x3c bytes
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Finalize() + 0x16 bytes
[Native to Managed Transition]
kernel32.dll!@BaseThreadInitThunk@12() + 0xe bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
Nulla al di sopra della chiamata ForceExitMessageLoop, debugger non gestito abilitato.
This happens on the 64-bit version of Windows 8
Hans l'ha detto!
Exit(0)
un po 'di tempo fa con un po' di Win7 a 64 bit, il cambio ExitCode
ora non ha aiutato a usare Process.GetCurrentProcess().Kill()
senza alcun problema funziona