Process.Start在某些客户端上随机阻塞/挂起

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

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

电话很简单

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

在BackgroundWorker线程中。

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

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

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

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

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

可以有防病毒软件干扰吗? (客户端安装了Symantec AV)

更新:我假设当我做了一个

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

默认情况下psi.UseShellExecute为FALSE …这是不正确的。 它默认为TRUE。 这是正常的吗?

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

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

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

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

编辑:记忆慢慢返回。 我在process.WaitforExit() 之后使用了 process.ReadToEnd()。 输出缓冲区很小,所以有效地填充然后停止,等待某些东西(我,即进程调用者)来读取它。 当然,这是无法做到的,因为我的代码仍在等待流程完成。

WaitForExit() 之前放入process.ReadToEnd()为我修复它,尽管听起来很简单。 但是,如果你没有将详细输出吐出到控制台那么它可能完全不同于其他东西……

Interesting Posts