2010-10-21 32 views
0

我已经继承了一些VB.net代码。我的任务是找出它不工作的原因。我有2个应用程序。第一个无法在VB.net中获取进程死亡

作为服务运行,无限地检查表以查看是否有任何要处理的任务。如果它找到一个,它应该启动第二个应用程序来处理任务,然后返回到循环并检查另一个。这两个应用程序都是窗体,但不显示任何窗口。我遇到的问题是第二个应用程序完成后,第一个应用程序从未收到信号,因此它永远在等待,因此无法进入下一个任务。如果我进入TaskManager并杀死第二个应用程序,那么第一个应用程序将获取该通知并继续进行。以下是我如何创建流程并等待它。我尝试了几种创建和等待过程的不同方式(使用Shell/OpenProcess,WaitForSingleObject等),但我无法实现它。我搜索了互联网,StackOverflow和MSDN网站,但没有尝试过。我一直在搞这个2天!

形式1个负载:

Dim ProcessProperties As New ProcessStartInfo 
ProcessProperties.FileName = strExeFullPath 
ProcessProperties.Arguments = " /project " & l_project 
ProcessProperties.CreateNoWindow = True 
Dim myProcess As Process = Process.Start(ProcessProperties) 
myProcess.WaitForExit() 

当窗体2完成时,它确实Me.Close()和退出小组在负载子程序但过程是在任务管理仍呈现和永远不会返回到Form1所以Form1永远在WaitForExit中。我尝试关闭每个打开的文件和连接,并将它们设置为Form2,Me.Dispose等中的Nothing。我已经尝试过Application.Exit作为Form2的最后一行。那个愚蠢的东西不会死!为什么不能死呢??? !!

我错过了什么?

+0

你的意思是'App1'是一个Windows服务,App2是由用户运行,还是'App1'服务本身启动'App2'? – 2010-10-21 15:26:44

+0

App1启动App2。最终,App1将由FireDaemon启动,但现在我正在从命令行运行它。运行FireDaemon时它的行为方式相同。对困惑感到抱歉。我仍在学习术语。 – mfowler 2010-10-21 15:45:01

回答

1

如果我进入任务管理器和杀第二个应用程序,第一个得到该通知

睁大你的眼睛上球,真正的问题是,这第二个应用程序未通过退出本身。因此myProcess.WaitForExit()不会返回。因此,这是而不是您的代码段中存在问题。

为什么第二个应用程序不想退出完全不清楚你的问题。鉴于它是Windows窗体应用程序,请记住没有人单击窗体的“关闭”按钮。 Application.Exit()应该使其停止,Environment.Exit()是一个无法被FormClosing事件处理程序否决的粗鲁中止。

+0

谢谢!这是我的想法,但想确保我正确地开始了这个过程,所以这就是为什么我包含该片段。我尝试了所有我能想到的第二个应用程序完全退出。没有尝试Environment.Exit但Application.Exit()没有这样做。我已经尝试将第二个应用程序中使用的所有内容设置为Nothing,并确保在退出之前关闭所有打开的文件和连接并将其设置为Nothing。我不知道如何找出持有的东西。如果必须的话,我们可以粗暴地杀死它,但我宁愿第二个应用程序尽可能优雅地退出。 – mfowler 2010-10-21 18:31:55

+0

评论中没有任何内容会帮助我。 – 2010-10-21 18:36:03

+0

对不起。我只是寻找可能遇到过这种情况的人的帮助,并且可能会对我可能会丢失的东西有所了解,或者指示我获得更多信息。我不知道还有什么可以说是有帮助的。我已经写了我尝试过的一切。如果还有其他类型的信息我可以发布,这将有所帮助,请让我知道。 – mfowler 2010-10-21 18:51:03

0

反正用这个:需要

ProcessProperties.Arguments = String.Format("/project {0}", 1_project) 

没有前导空格和代码变得更具可读性。

干杯!

0

我怀疑Form2试图在退出之前显示一些模式对话框(可能是一个消息框,也许是一个未处理的异常框)。由于App2App1(这是一项服务)启动,因此Form2无法与桌面进行交互,只能坐在那里等待不会发生的按钮点击。

试着让App1服务与桌面交互(你可以找到该服务的属性对话框的Log On选项卡上的选项),并检查是否Form2退出前居然会弹出一个对话框。