vb.net 进程类未到达 process.exited 事件

标签 vb.net class events process

我基于此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# 编写的,我不明白。

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

最佳答案

您可以替换这部分代码:

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/

相关文章:

c# - 将 C# 语句体 lambda 转换为 VB

c# - 如何将所有列作为属性的 DataTable 导出到 Xml?

javascript - 在文件之间拆分 Node.js 类扩展

Swift - 添加一个常量,接受参数并返回值

javascript - CanJS 右键单击​​事件

java - ActionEvent getModifiers 方法的 JTextField 问题

c# - SSIS - 文件存在性检查未正确控制包任务流

c# - 调用堆栈和评估堆栈如何关联?

C++ 映射类的值

c# - 调试 TargetInvocationException