2010-02-09 36 views
0

我完全是VB.net的新手,现在我正在开发Windows服务,它将在启动时启动* .exe。如果可执行文件被其他程序杀死,我该如何检测并重新启动这个可执行文件的进程?如何在VB.net中重新运行可执行文件

我的代码如下:

Public Class MyWinService 
Dim RetVal 
Protected Overrides Sub OnStart(ByVal args() As String) 
    EventLog.WriteEntry("MyService Started") 

    RetVal = Shell("JobService.exe", 1) 

End Sub 

Protected Overrides Sub OnStop() 
    EventLog.WriteEntry("MyService Stopped") 
    Dim myProcess = Process.GetProcessById(RetVal) 
    myProcess.Kill() 
End Sub 

Protected Overrides Sub OnPause() 
    EventLog.WriteEntry("MyService Paused") 
End Sub 

Protected Overrides Sub OnContinue() 
    EventLog.WriteEntry("MyService Resumed") 
End Sub 

Protected Overrides Sub OnCustomCommand(ByVal command As Integer) 
    If command = 200 Then 
     EventLog.WriteEntry("Custom Command 200 invoked") 
    ElseIf command = 210 Then 
     EventLog.WriteEntry("Custom Command 210 invoked") 
    End If 
End Sub 

Private Sub Process1_Exited(ByVal sender As System.Object, ByVal e As System.EventArgs) 

End Sub 

末级

非常感谢提前!

+0

为什么你的服务启动外部可执行文件,而不是只是在做里面的服务工作? – CoderDennis

+0

可执行文件是用C++编写的,似乎用C++设计一个windows服务要困难得多,所以我切换到VB.net并使用这个windows服务来运行一个外部可执行文件。谢谢。 – Ray

+0

以前没有人推荐过使用Process类吗?它支持一个Exited事件和一个ExitCode属性。 –

回答

3

错误的做法是在OnStart()方法中创建一个Process对象。将方法绑定到重新启动对象的过程对象的Exited事件。 http://msdn.microsoft.com/en-us/library/system.diagnostics.process.onexited(VS.71).aspx有关于退出事件的一些信息。

正确的做法是创建一个Timer对象。每X分钟,创建一个Process对象,检查句柄ID,并查看它是否正在运行。如果没有,那么创建一个新的可执行文件,类似于你在OnStart()方法上做的。

http://csharpstruggles.blogspot.com/2005/02/using-timer-in-windows-service.html

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/bc175c60-f81b-4d1a-975d-717368468238

优雅的方式是,如上面提到的,做服务本身的工作。

2

可以使用的Process.Start和process.Exited methodes,像这样:

Imports System.Diagnostics 

Public Class Form1 
Dim WithEvents proc As Process 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_ 
    Handles Button1.Click 
' start the process 
proc = Process.Start(progName) 
proc.EnableRaisingEvents = True 
End Sub 

Private Sub proc_Exited(ByVal sender As Object, ByVal e As System.EventArgs) _ 
    Handles proc.Exited 
' restart the process whenever it exits 
proc = Process.Start(progName) 
proc.EnableRaisingEvents = True 
End Sub 

End Class 
相关问题