Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进程。Start在某些客户端上随机阻塞/挂起_C#_Blocking_Process.start - Fatal编程技术网

C# 进程。Start在某些客户端上随机阻塞/挂起

C# 进程。Start在某些客户端上随机阻塞/挂起,c#,blocking,process.start,C#,Blocking,Process.start,(有一个非常类似的话题从未解决:) 我们有一个大型应用程序在几个客户端上运行,但最近我的一些代码停止了工作。添加一些调试代码时,我发现代码在调用Process.Start()时停止(未设置shellexecute=true) 这个电话很简单 Process.Start(new ProcessStartInfo("program")) 在后台工作线程中 “程序”应用程序执行它应该执行的操作并退出 当线程位于后台时,我们的应用程序将继续运行,但如果应用程序运行另一个进程。从GUI线程开始

(有一个非常类似的话题从未解决:)

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

这个电话很简单

 Process.Start(new ProcessStartInfo("program"))    
在后台工作线程中

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

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

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

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

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

防病毒软件会干扰吗?(客户端已安装Symantec AV)

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

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

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

我不久前遇到一个问题,如果其他程序在错误的时间读取程序输出,则向外输出到外部进程可能会导致争用情况。这就是你看到的吗

更多关于该网站的信息

编辑:内存缓慢返回。我在process.WaitforExit()之后使用process.ReadToEnd()。输出缓冲区非常小,所以我们实际上填满了,然后停止,等待某个东西(我,即进程调用方)读取它。这当然是不可能的,因为我的代码仍在等待进程完成


将process.ReadToEnd()放在WaitForExit()之前为我解决了这个问题,尽管这听起来很有趣。但是如果你没有将详细的输出发送到控制台,那么它可能完全是另一回事…

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


我们的一个客户端服务器上启用了Symantec病毒保护,这与我们遇到的问题非常相似。我们通过在防病毒软件上设置异常来修复它。或者,您可以禁用UseShellExecute

要排除AV,请在sysinternals filemon运行的情况下创建进程,并查看新进程是否有任何问题可执行如何终止该线程?你为什么要杀线?是否检查Bgw.Completed中的错误?@Alex如果程序重新启动,它将再次正常运行。所以很难复制,这意味着filemon可能运行得很好。@Henk。终止线程只是一个解决办法,因此应用程序将继续按其应该的方式运行。用Process.Start()调用的程序已经运行并完成了它的工作。尽管如此,.Net代码仍然挂在那里,它不应该挂在那里。所以我终止了线程。我不会杀死BG线程。我已经移动了进程。开始使用一个新方法,该方法创建一个线程,如果没有返回,则终止它。进程。Start正在阻塞线程。“没有出现错误。@Alex。我使用filemon,然后使用procmon。在程序运行之前,我看不到任何东西正在访问它,但我不知道procmon是否会注意到底层DLL上的杂项调用上的系统挂钩。外部程序是一个3d party程序,确保只运行一个实例。也就是说,无论何时使用参数调用程序,它都会被发送到程序的allready运行实例并退出自身。它不是控制台程序,因此不应该有输出(?)。我不知道在进行单实例运行检查时使用了什么样的通信。Process.Start单独运行,而不是与另一个调用同时运行。更准确地说。在BG线程中调用该程序之前,在GUI线程上使用.WaitForExit+Sleep(500ms)完成对同一程序的调用。可能必须这样。对我来说,解决方法就是运行进程。在它自己的线程中启动,然后在线程永不返回时杀死该线程。使用UseShellExecute=false,我会得到一个“访问被拒绝”异常。有了它=真,我就遇到了电话永远不回的问题。所以,如果我做了,我会被诅咒,如果我不做,我会被诅咒。还有什么想法吗?