退出事件处理程序强制关闭应用程序

时间:2012-04-03 17:07:31

标签: vb.net events process

我有一些代码用于启动process(记事本),并为Exited事件动态生成事件处理程序。

Private WithEvents notepad As New Process

notepad.StartInfo.FileName = "notepad.exe"
notepad.StartInfo.Arguments = fil
notepad.EnableRaisingEvents = True

notepad.Start()
AddHandler notepad.Exited, AddressOf ExitNotepad

但是当我尝试更改事件处理程序中标签的文本时,应用程序才会关闭,而根本没有任何错误消息。

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

    lblLabel.Text = "Test"

End Sub

有人有任何想法吗?

1 个答案:

答案 0 :(得分:1)

您需要使其成为线程安全的,因为事件处理程序可能发生在不同的线程中。此外,我在启动进程之前添加了处理程序。我使用Button来启动记事本,我的标签名为Label1:

Public Class Form1

    Private WithEvents notepad As New Process
    Delegate Sub SetLabel1Callback()

    Sub SetLabel1()
        If Label1.InvokeRequired Then
            Dim d As New SetLabel1Callback(AddressOf SetLabel1)
            Me.Invoke(d)
        End If

        Label1.Text = "Test"
    End Sub

    Sub ExitNotepad(ByVal sender As System.Object, ByVal e As System.EventArgs)
        SetLabel1()
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim fil = "C:\temp\test.txt"

        notepad.StartInfo.FileName = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "notepad.exe")
        notepad.StartInfo.Arguments = fil
        notepad.EnableRaisingEvents = True
        AddHandler notepad.Exited, AddressOf ExitNotepad

        notepad.Start()
    End Sub
End Class

我给它一个显式的notepad.exe路径 - 尽可能使用显式路径。

使用Visual Studio 11测试版在Windows 7 x64上进行测试。