2009-03-23 10 views
13

Sto avviando un processo esterno con System.Diagnostics.Process. Questo fa parte di un processo batch, quindi se un processo si blocca, mi piacerebbe gestirlo e lasciare che il resto continui.Come gestire un arresto anomalo in un processo avviato tramite System.Diagnostics.Process?

Quello che succede attualmente è Windows apre una finestra di dialogo che mi dice che il programma si è arrestato in modo anomalo, e solo dopo averlo ignorato, il processo viene chiuso manualmente.

In base a this question, la proprietà Process.Responding è disponibile solo per i programmi con interfaccia utente (il processo che sto avviando è un'app console).

Ho anche esaminato i vari eventi forniti da un processo, ma nessuno di essi è stato attivato in caso di arresto anomalo.

Qualche idea?

risposta

25

provare a impostare il Registro di sistema seguente valore di registro al valore DWORD 2:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode = 2 

questo influenzerà ogni processo sulla macchina.

Riferimento: How to Get Rid of System and Application Popup Messages

Se hai il codice sorgente per il programma che si blocca, è possibile impedire il popup con la cattura di tutte le eccezioni strutturate e uscire senza spuntando una finestra di messaggio. Il modo in cui lo fai dipende dal linguaggio di programmazione utilizzato.

Se non si dispone del sorgente, utilizzare la funzione SetErrorMode nel genitore per sopprimere i popup. La modalità di errore è ereditata dai sottoprocessi. È necessario impostare UseShellExecute false per questo lavoro: "Vuoi eseguire il debug utilizzando il debugger selezionato"

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 


namespace SubProcessPopupError 
{ 

    class Program 
    { 
     [DllImport("kernel32.dll", SetLastError = true)] 
     static extern int SetErrorMode(int wMode); 

     static void Main(string[] args) 
     { 
      int oldMode = SetErrorMode(3); 
      Process p; 
      ProcessStartInfo ps = new ProcessStartInfo("crash.exe"); 
      ps.UseShellExecute = false; 
      p = Process.Start(ps); 
      SetErrorMode(oldMode); 
      p.WaitForExit(); 
     } 
    } 
} 

Se hai trovato una finestra dicendo, si può spegnerlo impostando questo valore del Registro a 0 .

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Auto = 0 

Tuttavia, non credo che questo si presenti se è stata impostata la modalità di errore di 3 come spiegato sopra.

+0

Sembra che questo dovrebbe funzionare, ma è un po 'come usare una spada per diffondere il burro. Questo programma dovrà essere eseguito sui computer di altre persone, quindi non è possibile modificare le proprietà dell'intero sistema :( – meatvest

+0

Vedere il paragrafo aggiuntivo che ho aggiunto alla mia risposta.Se hai il codice sorgente ... prendi tutte le eccezioni –

+0

quello che ha spinto la mia domanda in realtà è stato causato durante il caricamento dei riferimenti del programma - il metodo Main() non era nemmeno stato inserito - il che significa che l'eccezione era (per quanto ho capito) impossibile da catturare – meatvest

0

Un'altra opzione è quella di eseguire il file eseguibile sotto cdb, e quindi cercare la parola "eccezione", utilizzando la seguente riga di comando:

cdb.exe -G -g -c "Q" <your executable> 
Problemi correlati