2010-02-09 40 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 
相關問題