没有到达process.exited事件的vb.net进程类

时间:2016-04-21 11:43:29

标签: vb.net class events process

我已根据此msdn page创建了class,这是我的process.exited事件永远无法到达的唯一问题。

该进程的.exe是我创建的控制台应用程序。当它完成时它会自动关闭它。但我的事件没有达到,我必须等待30秒才能恢复代码。

有什么我做错了吗?对于我的测试用例,.exe只需要+ - 5秒即可完成。

  

我假设在代码完成后关闭控制台应用程序时退出该进程。我的这个假设是错的?

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#中,我不明白。

c# possible answer

更正了代码,但使用了另一个作为答案发布的解决方案。

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

1 个答案:

答案 0 :(得分:2)

你可以替换这部分代码:

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方法非常有用,它将冻结您的代码,直到给定的软件完成。如果运行更长的进程,则可能需要后台工作程序。