7

(有一个非常相似的话题从未得到解决:这里

我们有一个在多个客户端上运行的大型应用程序,但最近我的一些代码停止工作。添加一些调试代码我发现代码在调用 Process.Start() 时停止(没有设置 shellexecute=true)。

通话很简单

 Process.Start(new ProcessStartInfo("program"))    

在 BackgroundWorker 线程中。

“程序”应用程序执行它应该执行的操作并退出。

当线程在后台时,我们的应用程序会继续运行,但如果应用程序在 GUI 线程上运行另一个 Process.Start,则应用程序会锁定。如果使用 X 按钮关闭应用程序,则应用程序仍会显示在任务管理器中,因为线程仍被 Process.Start 阻止。

问题是这种行为无法重现。它在某些客户端计算机上随机发生。

使 Process.Start() 挂起会发生什么?(Program.Main 用 [STAThread] 标记)

我目前刚刚做了一个解决方法,在它自己的线程中启动 Process.Start(),如果到那时它还没有返回,它会在 5 秒后杀死它。但这对于等待代码返回的用户来说是 5 秒(我不知道我可以将超时设置多低,因为在某些情况下我需要 Process.Start() 上的返回值)。

会不会有杀毒软件干扰?(客户端安装了 Symantec AV)

更新:我假设当我做了

ProcessStartInfo psi = new ProcessStartInfo("ping", "localhost");

psi.UseShellExecute 默认为 FALSE ...这是不正确的。它默认为真。这是正常的吗?

4

2 回答 2

8

我知道这个线程有点旧,但如果有人感兴趣,这是由 shell 扩展(在这种情况下是防病毒软件)引起的。基本上,当您以 UseShellExecute=true(default) 启动时,防病毒软件会干扰 Processor.Start 并使其挂起(似乎是随机的)。有趣的是,进程启动得很好,挂起的是调用者线程。

在我们客户的一台服务器中启用了赛门铁克病毒防护时,我们遇到了同样的问题。我们通过在防病毒软件上设置例外来修复它。或者,您可以禁用 UseShellExecute。

于 2012-02-14T22:34:24.230 回答
1

前段时间我遇到了一个问题,如果其他东西在错误的时间读取程序输出,那么对外部进程进行炮击可能会导致竞争条件。这可能是你所看到的吗?

有关StandardOutput 的 MSDN 文章的更多信息。

编辑:记忆慢慢恢复。我在 process.WaitforExit()之后使用了 process.ReadToEnd ()。输出缓冲区非常小,因此有效地填满然后停止,等待某些东西(我,即进程调用者)读取它。它当然不能这样做,因为我的代码仍在等待该过程完成。

将 process.ReadToEnd() 放在WaitForExit() 之前为我修复了它,虽然这听起来很直观但是,如果您没有向控制台吐出详细的输出,那么它可能完全是另外一回事......

于 2011-04-18T12:30:25.580 回答