12

Cuando uso el depurador de VSTS para ver las propiedades de la instancia de la clase Process, muchas de las propiedades están marcadas con InvalidOperationException. ¿Por qué? ¿Estoy haciendo algo mal?Excepción de operación no válida de C# Process Class

Estoy usando VSTS 2008 + C# + .Net 2.0 para desarrollar una aplicación de consola.

Aquí está mi código:

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(); 

Y una captura de pantalla del depurador:

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

+1

Cargue los detalles del mensaje de excepción. –

+0

Gracias, Chansik, mensaje de excepción detallada (Exception.Message) es "Ningún proceso está asociado con este objeto". He probado después de iniciado el proceso, los valores se están volviendo válidos. Estoy confundido por qué antes del inicio del proceso los valores se muestran como InvalidOperationException? Es con qué propósito (¿por qué no tener un valor predeterminado para mostrar)? – George2

Respuesta

28

¿Había hecho comenzó el proceso depurador cuando la imagen fue tomada? Esa es la captura de pantalla que esperaría ver antes de que se llame al método Start().

Tenga en cuenta que el patrón común es crear un ProcessStartInfo, rellenarlo y llamar al método estático Process.Start(startInfo). Eso lo hace conceptualmente más simple: no ve el objeto Process hasta que se haya iniciado.

+0

Gracias Jon, lo he probado después de iniciado el proceso, los valores se están volviendo válidos. Estoy confundido por qué antes del inicio del proceso los valores se muestran como InvalidOperationException? Es con qué propósito (¿por qué no tener un valor predeterminado para mostrar)? – George2

+1

Porque el getter está lanzando una excepción. Tiene sentido si lo piensas; esas propiedades no serán válidas hasta que el proceso haya comenzado o salido. –

+4

Definitivamente no deberían * devolver los valores predeterminados. Si lo hicieran, se podría suponer que esos valores se habían devuelto correctamente de un proceso real. Lo que estás haciendo es el equivalente a pedir una referencia nula para su longitud como una cadena ... ¡no tiene una, no es una cadena! Del mismo modo, usted no * tiene * un proceso para pedir su cuenta, etc. La excepción es decirle que * está haciendo algo incorrecto *: es decir, recuperar propiedades antes de comenzar el proceso.Eso nunca puede ser una tarea útil, y la excepción es un indicador mucho mejor de eso que los valores predeterminados. –

4

La mayoría de las propiedades estarán disponibles después de que comience el proceso de IExplore.

+0

Entonces, ¿crees que se espera? – George2

+0

Hola, ArsenMkrt, lo he probado después de iniciar el proceso, los valores se están volviendo válidos. Estoy confundido por qué antes del inicio del proceso los valores se muestran como InvalidOperationException? Es con qué propósito (¿por qué no tener un valor predeterminado para mostrar)? – George2

+1

Dado que las propiedades no tienen significados antes del inicio del proceso, ¿qué propiedad del proceso debería ser manejador si el proceso no se inicia? ¿O cómo saber si hay un error o no para llenar las propiedades de error antes de que se inicie el proceso? –

1

Sí, este es el comportamiento esperado y está claramente documentado en MSDN también.

Por ejemplo, la propiedad Process.BasePriority puede lanzar una excepción InvalidOperationException cuando el proceso ha finalizado o el proceso no se ha iniciado (ver más detalles en MSDN).

+0

Gracias Chansik, ¡tu respuesta tiene sentido! – George2

1

Muchas de las propiedades están marcadas con InvalidOperationException porque hasta que inicie el proceso. El objeto 'myProcess' no está asociado con ningún proceso en ejecución y, por lo tanto, no puede obtener la información.

intente estas declaraciones, después de que el código para iniciar el proceso de

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

Ahora, cuando estás dentro de la instrucción if, el depurador VSTS será capaz de mostrar la mayor parte de las propiedades asociadas con el myProcess objeto . Esto sucede porque el objeto myProcess ahora está asociado con un proceso en ejecución "IExplore.exe".

+0

Genial, gracias Pradeepneo! – George2

Cuestiones relacionadas