2012-04-03 33 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 

そして、私はそれをメモ帳への明示的なパスを与えた - 可能な場合は常に、明示的なパスを使用します。

Visual Studio 11 Betaを使用してWindows 7 x64で動作することがテストされています。

関連する問題