我有一些代码用于启动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
有人有任何想法吗?
答案 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上进行测试。