【发布时间】:2011-03-31 03:16:37
【问题描述】:
我们的应用程序有一个后台线程,它通过System.Diagnostics.Process 产生一个进程:
Process.Start(
new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
}
);
这过去完全没有问题。但是现在,后台线程正在悄然消亡;它永远不会从对Process.Start 的调用中返回。处理System.Exception 的这段代码的catch 块也没有到达。即使我在 Visual Studio 调试器中引发异常时启用处理,我也看不到异常。奇怪的是,这个过程正在生成就好了。用户的默认浏览器使用预期的 URL 启动。
我们流程的入口点按照推荐标记为[STAThread]。
什么可能导致我们的线程静默终止?有什么技术可以用来调试线程终止期间发生的事情吗?
更新:
看起来线程毕竟是活着的;它只是没有从通话中返回。这是它的堆栈跟踪:
- [在睡眠等待或加入]
- System.dll!System.Diagnostics.ShellExecuteHelper.ShellExecuteOnSTAThread() + 0x63 字节
- System.dll!System.Diagnostics.Process.StartWithShellExecuteEx(System.Diagnostics.ProcessStartInfo startInfo) + 0x19d 字节
- System.dll!System.Diagnostics.Process.Start() + 0x39 字节
- System.dll!System.Diagnostics.Process.Start(System.Diagnostics.ProcessStartInfo startInfo) + 0x32 字节
- 我的方法
更新 2:
在不使用 shell 执行的情况下启动 cmd.exe 是一种解决方法。非常感谢!但是,我仍然想知道为什么电话没有返回。
更新 3:
Shell 挂钩听起来确实是对可能导致调用不返回的原因的合乎逻辑的解释。我找不到流氓模块,但在最后一次尝试通过 shell 执行运行之后,调用 did 返回了。
在任何情况下,用户都可能加载了 shell 扩展,这可能会干扰进程启动并导致我的代码无法返回。我们对那个无能为力,所以正确的答案是使用启动 cmd.exe 进程的解决方法。
【问题讨论】:
标签: .net multithreading shell browser process