无法让进程在VB.net中死掉

时间:2010-10-21 15:17:04

标签: vb.net

我继承了一些VB.net代码。我的任务是找出它不起作用的原因。我有2个申请。第一个

作为服务运行,无限地检查表以查看是否有任何要处理的任务。如果它找到一个,它应该触发第二个应用程序来处理任务然后返回循环并检查另一个。这两个应用程序都是表单,但它们不显示任何窗口。我遇到的问题是在第二个应用程序完成后,第一个应用程序永远不会得到它已完成的信号,因此它永远等待,因此它无法进入下一个任务。如果我进入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()

当Form2完成时,它在加载子例程中执行Me.Close()和Exit Sub,但该过程仍在TaskManager中显示,并且永远不会返回到Form1,因此Form1永远在WaitForExit中。我已经尝试关闭每个打开的文件和连接,并在Form2,Me.Dispose等中将它们设置为Nothing。我已经尝试将Application.Exit作为Form2的最后一行。那个蠢事不会死!为什么不会DIE !! ?? !!

我错过了什么?

3 个答案:

答案 0 :(得分:1)

  

如果我进入TaskManager并终止第二个应用程序,第一个应用程序将获得该通知

密切关注球,真正的问题是第二个应用程序本身没有退出。因此myProcess.WaitForExit()不会返回。所以这是您的代码段中的问题。

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

答案 1 :(得分:0)

无论如何使用它:

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

不需要前导空格,代码变得更具可读性。

干杯!

答案 2 :(得分:0)

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

尝试允许App1服务与桌面交互(您可以在服务属性对话框的Log On选项卡上找到该选项)并检查Form2是否实际弹出退出前的对话框。