12

Quando utilizzo il debugger VSTS per visualizzare le proprietà dell'istanza della classe Process, molte delle proprietà sono contrassegnate con InvalidOperationException. Perché? Sto facendo qualcosa di sbagliato?Eccezione operazione non valida dalla classe processo C#

Sto utilizzando VSTS 2008 + C# + .Net 2.0 per sviluppare un'applicazione console.

Ecco il mio codice:

System.Diagnostics.Process myProcess = new System.Diagnostics.Process(); 
myProcess.StartInfo.FileName = "IExplore.exe"; 
myProcess.StartInfo.Arguments = @"www.google.com"; 
myProcess.StartInfo.Verb = "runas"; 
myProcess.Start(); 

e uno screenshot del debugger:

http://i26.tinypic.com/bdldvm.jpg http://i26.tinypic.com/bdldvm.jpg

+1

Si prega di caricare i dettagli del messaggio di eccezione. –

+0

Grazie, Chansik, il messaggio di eccezione dettagliato (Exception.Message) è "Nessun processo è associato a questo oggetto". Ho provato dopo l'avvio del processo, i valori stanno diventando validi. Sono confuso perché prima dell'inizio del processo i valori sono visualizzati come InvalidOperationException? È per quale scopo (perché non avere un valore predefinito da visualizzare)? – George2

risposta

28

Avevi effettivamente iniziato il processo quando l'immagine è stata presa debugger? Questo è lo screenshot che mi aspetto di vedere prima che venga chiamato il metodo Start().

Si noti che lo schema comune è quello di creare un ProcessStartInfo, compilarlo e quindi chiamare il metodo statico Process.Start(startInfo). Ciò lo rende concettualmente più semplice: non vedi l'oggetto Process finché non è stato avviato.

+0

Grazie Jon, ho provato dopo l'avvio del processo, i valori stanno diventando validi. Sono confuso perché prima dell'inizio del processo i valori sono visualizzati come InvalidOperationException? È per quale scopo (perché non avere un valore predefinito da visualizzare)? – George2

+1

Poiché il getter lancia un'eccezione. Ha senso se ci pensi; tali proprietà non saranno valide fino all'avvio o all'uscita del processo. –

+4

Devono assolutamente * non * restituire i valori predefiniti. Se lo facessero, si potrebbe presumere che quei valori fossero stati correttamente restituiti da un processo reale. Quello che stai facendo è l'equivalente di chiedere un riferimento null per la sua lunghezza come una stringa ... non ce l'ha, non è una stringa! Allo stesso modo non * hai * un processo per chiedere il suo conteggio degli handle, ecc. L'eccezione sta dicendo che stai * facendo qualcosa di sbagliato *: cioè il recupero delle proprietà prima di iniziare il processo.Non può mai essere una cosa utile da fare, e l'eccezione è un indicatore molto migliore di quello che sarebbero i valori di default. –

4

Molte delle proprietà diventano disponibili dopo l'avvio del processo IExplore.

+0

Quindi, pensi che sia previsto? – George2

+0

Ciao ArsenMkrt, ho provato dopo l'avvio del processo, i valori stanno diventando validi. Sono confuso perché prima dell'inizio del processo i valori sono visualizzati come InvalidOperationException? È per quale scopo (perché non avere un valore predefinito da visualizzare)? – George2

+1

Poiché tali proprietà non hanno significati prima dell'avvio del processo, quale dovrebbe essere la proprietà Handler del processo se il processo non è avviato? O come sapere c'è errore o meno nel riempire le proprietà degli errori prima dell'avvio del processo? –

1

Sì, questo è il comportamento previsto ed è chiaramente documentato anche in MSDN.

Ad esempio, Process.BasePriority Property può generare un'eccezione InvalidOperationException quando il processo è terminato o il processo non è stato avviato (vedere ulteriori dettagli in MSDN).

+0

Grazie Chansik, la tua risposta ha dei sensi! – George2

1

Molte proprietà sono contrassegnate con InvalidOperationException perché fino all'avvio del processo. L'oggetto "myProcess" non è associato a nessun processo in esecuzione e quindi non può ottenere le informazioni.

Prova ad aggiungere queste dichiarazioni, dopo il codice per avviare il processo

if (myProcess != null) 
{ 
    myProcess.WaitForExit(); 
    //or any other statements for that matter 
} 

Ora, quando si è all'interno della if, il debugger VSTS sarà in grado di mostrare la maggior parte delle proprietà associate al myProcess oggetto . Ciò accade perché l'oggetto myProcess è ora associato a un processo in esecuzione "IExplore.exe".

+0

Fantastico, grazie a Pradeepneo! – George2

Problemi correlati