2012-04-03 175 views
1

我有一些代码用于启动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

您需要使其线程安全,因为事件处理程序可能发生在另一个线程中。另外,我在启动过程之前添加了处理程序。我用了一个按钮来启动启动记事本,我的标签名为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 Beta测试为在Windows 7 x64上工作。