Process.Exited按钮事件异常:调整代码后仍报错,求解决方案
问题解决方案
你的代码存在两个核心问题:
- 跨线程访问UI控件异常:
Exited事件在后台线程触发,WinForm控件仅允许在创建它的UI线程中修改属性,直接操作Button1.Enabled会抛出跨线程异常。 - 变量访问错误与拼写错误:
Process1是Button1_Click方法内的局部变量,OnExit方法无法直接访问;你修改后的代码还把Process1拼写成了Procces1,这也会导致编译错误。
修正后的完整代码:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Button1.Enabled = False Dim Process1 As New Process Process1.StartInfo.FileName = ("data\test.exe") Process1.EnableRaisingEvents = True AddHandler Process1.Exited, AddressOf OnExit Process1.Start() End Sub Sub OnExit(ByVal sender As Object, ByVal e As EventArgs) ' 从sender获取触发事件的Process实例,避免局部变量访问问题 Dim targetProc As Process = DirectCast(sender, Process) ' 释放进程资源 targetProc.Close() ' 跨线程安全地修改UI控件状态 If Button1.InvokeRequired Then ' 需要切换到UI线程执行操作 Button1.Invoke(Sub() Button1.Enabled = True) Else Button1.Enabled = True End If End Sub
关键说明:
- 通过
DirectCast(sender, Process)获取触发事件的进程实例,无需依赖局部变量。 - 使用
InvokeRequired判断是否需要跨线程调用,通过Invoke将UI操作切换到UI线程执行,避免跨线程异常。 - 修正了拼写错误,确保代码编译通过。
内容的提问来源于stack exchange,提问作者YS HOME
相关产品推荐
相关产品推荐

