我基于此msdn page 创建了一个类
唯一的问题是我的 process.exited 事件从未达到。
该进程的.exe
是我创建的一个控制台应用程序。完成后它会自行关闭。但我的事件没有到达,我必须等待 30 秒代码才能恢复。
我是不是做错了什么?对于我的测试用例,.exe
只需要 +- 5 秒即可完成。
I assume when a console application closes after the code is done the process is exited. My this assumption is wrong?
Imports System
Imports System.Diagnostics
Imports System.Threading
Public Class CopyDesignProcessClass
Private WithEvents oProcess As New Process()
Private elapsedTime As Integer
Private eventHandled As Boolean
Public Event Exited As EventHandler
Shared Sub Start(ByVal oArgument As String)
' Verify that an argument has been entered.
If oArgument Is Nothing Or oArgument = "" Then
Exit Sub
End If
' Create the process and copy the design.
Dim myCopyDesignProcess As New CopyDesignProcessClass
myCopyDesignProcess.CopyDesign(oArgument)
End Sub
' Print a file with any known extension.
Sub CopyDesign(ByVal oArgument As String)
elapsedTime = 0
eventHandled = False
Try
' Start a process to copy a design and raise an event when done.
oProcess.StartInfo.FileName = "C:\Program Files\Autodesk\CopyDesign Tool\CopyDesignTool.exe"
oProcess.StartInfo.Arguments = oArgument
oProcess.Start()
Catch ex As Exception
MsgBox("An error occurred trying to copydesign " & oArgument & " :" &
vbCrLf & ex.Message, MsgBoxStyle.Exclamation, "CopyDesign Failed")
Return
End Try
' Wait for Exited event, but not more than 30 seconds.
Const SLEEP_AMOUNT As Integer = 100
Do While Not eventHandled
elapsedTime += SLEEP_AMOUNT
If elapsedTime > 30000 Then
Exit Do
End If
Thread.Sleep(SLEEP_AMOUNT)
Loop
End Sub
' Handle Exited event and display process information.
Private Sub myProcess_Exited(ByVal sender As Object,
ByVal e As System.EventArgs) Handles oProcess.Exited
eventHandled = True
Debug.Print("Exit time: {0}" & vbCrLf &
"Exit code: {1}" & vbCrLf &
"Elapsed time: {2}",
oProcess.ExitTime, oProcess.ExitCode, elapsedTime)
End Sub
End Class
附加:
答案可能会在这篇文章中给出,但它是用 c#
编写的,我不明白。
更正了代码,但使用了作为答案发布的另一个解决方案。
Imports System
Imports System.Diagnostics
Imports System.Threading
Public Class CopyDesignProcessClass
Private WithEvents oProcess As New Process()
Private elapsedTime As Integer
Private eventHandled As Boolean
Public Event Exited As EventHandler
Shared Sub Start(ByVal oArgument As String)
' Verify that an argument has been entered.
If oArgument Is Nothing Or oArgument = "" Then
Exit Sub
End If
' Create the process and copy the design.
Dim myCopyDesignProcess As New CopyDesignProcessClass
myCopyDesignProcess.CopyDesign(oArgument)
End Sub
' Print a file with any known extension.
Sub CopyDesign(ByVal oArgument As String)
elapsedTime = 0
eventHandled = False
Try
' Start a process to copy a design and raise an event when done.
oProcess.StartInfo.FileName = "C:\Program Files\Autodesk\CopyDesign Tool\CopyDesignTool.exe"
oProcess.StartInfo.Arguments = oArgument
oProcess.EnableRaisingEvents = True
oProcess.Start()
Catch ex As Exception
MsgBox("An error occurred trying to copydesign " & oArgument & " :" &
vbCrLf & ex.Message, MsgBoxStyle.Exclamation, "CopyDesign Failed")
Return
End Try
' Wait for Exited event, but not more than 30 seconds.
Const SLEEP_AMOUNT As Integer = 100
Do While Not eventHandled
elapsedTime += SLEEP_AMOUNT
If elapsedTime > 30000 Then
Exit Do
End If
Thread.Sleep(SLEEP_AMOUNT)
Loop
End Sub
' Handle Exited event and display process information.
Private Sub myProcess_Exited(ByVal sender As Object,
ByVal e As System.EventArgs) Handles oProcess.Exited
eventHandled = True
Debug.Print("Exit time: {0}" & vbCrLf &
"Exit code: {1}" & vbCrLf &
"Elapsed time: {2}",
oProcess.ExitTime, oProcess.ExitCode, elapsedTime)
End Sub
End Class
最佳答案
您可以替换这部分代码:
Try
' Start a process to copy a design and raise an event when done.
oProcess.StartInfo.FileName = "C:\Program Files\Autodesk\CopyDesign Tool\CopyDesignTool.exe"
oProcess.StartInfo.Arguments = oArgument
oProcess.Start()
Catch ex As Exception
MsgBox("An error occurred trying to copydesign " & oArgument & " :" &
vbCrLf & ex.Message, MsgBoxStyle.Exclamation, "CopyDesign Failed")
Return
End Try
' Wait for Exited event, but not more than 30 seconds.
Const SLEEP_AMOUNT As Integer = 100
Do While Not eventHandled
elapsedTime += SLEEP_AMOUNT
If elapsedTime > 30000 Then
Exit Do
End If
Thread.Sleep(SLEEP_AMOUNT)
Loop
与:
Try
' Start a process to copy a design and raise an event when done.
oProcess.StartInfo.FileName = "C:\Program Files\Autodesk\CopyDesign Tool\CopyDesignTool.exe"
oProcess.StartInfo.Arguments = oArgument
oProcess.Start()
oProcess.WaitForExit()
Catch ex As Exception
MsgBox("An error occurred trying to copydesign " & oArgument & " :" &
vbCrLf & ex.Message, MsgBoxStyle.Exclamation, "CopyDesign Failed")
Return
End Try
waitforexit
方法非常有用,它会卡住您的代码,直到给定的软件完成。如果运行较长的进程,可能需要后台工作程序。
关于vb.net 进程类未到达 process.exited 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36768563/