Nuestra aplicación tiene un hilo de fondo que genera un proceso a través System.Diagnostics.Process
:proceso generado a través Process.Start en .NET cuelga el hilo
Process.Start(
new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
}
);
Esto solía tener ningún problema en absoluto. Pero ahora, el hilo de fondo está muriendo silenciosamente; nunca regresa de la llamada al Process.Start
. El bloque catch para este código, que maneja System.Exception
, tampoco está siendo alcanzado. Incluso si habilito el manejo de excepciones cuando se lanza en el depurador de Visual Studio, no veo excepciones. Extrañamente, el proceso se engendra perfectamente; el navegador predeterminado para el usuario se inicia con la URL esperada.
El punto de entrada de nuestro proceso está marcado con [STAThread]
como se recomienda.
¿Qué podría estar causando que nuestro hilo termine silenciosamente? ¿Hay alguna técnica que pueda usar para depurar lo que está sucediendo durante la terminación del hilo?
Actualización:
Parece que el hilo está vivo después de todo; simplemente no regresa de la llamada. Aquí está su seguimiento de la pila:!!
- [En una espera de sueño o unirse]
- System.dll System.Diagnostics.ShellExecuteHelper.ShellExecuteOnSTAThread() + 0x63 bytes
- System.dll System.Diagnostics.Process .StartWithShellExecuteEx (System.Diagnostics.ProcessStartInfo startInfo) + 0x19d bytes
- System.dll! System.Diagnostics.Process.Start (+) 0x39 bytes
- System.dll! System.Diagnostics.Process.Start (System.Diagnostics .ProcessStartInfo startInfo) + 0x32 bytes
- Mi método
Actualización 2:
cmd.exe lanzamiento sin utilizar el shell para ejecutar obras como una solución. ¡Gracias un montón! Sin embargo, todavía me gustaría saber por qué la llamada no está regresando.
Actualización 3:
ganchos Shell suenan como una explicación lógica para lo que podría ser la causa de la llamada a no volver. No pude encontrar el módulo falso, pero después del último intento de ejecutar cosas a través de la ejecución del shell, la llamada hizo devolver.
En cualquier caso, es posible que los usuarios tengan cargadas extensiones de caparazón que podrían interferir con el inicio del proceso y hacer que mi código no regrese. No podemos hacer nada sobre que, por lo que la respuesta correcta es utilizar la solución alternativa de iniciar un proceso cmd.exe.
No hay sorpresas con las adiciones 'Trace.WriteLine'; el "Proceso iniciado". línea no alcanzada – Jacob
Al iniciar cmd.exe, la llamada sigue sin aparecer. – Jacob
Bah, pero lo hace si convierto a UseShellExecute en falso. – Jacob