vb.net - 外部程序退出后出现“调用线程必须是STA,因为许多UI组件需要这个”错误
问题描述
我是 .NET 世界的新手,遇到了一个我似乎无法解决的问题。搜索此论坛和许多其他论坛没有产生结果。
我有一个 VB.NET 程序,它启动一个外部程序,然后等待程序退出,然后显示一个结果表单。
结果表单加载了一些由外部程序创建的数据,并与图表一起显示。结果表单有两个 WPF 按钮 (HostElements),以及标签和图表。
我还应该提到,外部程序大约需要 20-30 分钟才能完成。
如果我使用 SubProcess.WaitForExit() 方法,当我尝试启动结果表单时,我的程序会抛出“没有足够的配额来处理此命令”。
为了克服这个错误,我将程序更改为使用 Exited 事件来启动表单,现在得到“System.InvalidOperationException:'调用线程必须是 STA,因为许多 UI 组件需要这个。'”错误时结果表启动。
相关代码片段如下......任何提示,建议,指导非常感谢。
Public WithEvents SubProcess As New Process
Public oProg As New ProcessStartInfo
Public Sub StartAMTAS()
oProg.FileName = "something.exe"
oProg.Arguments = " /ar /op /ov /fv Name"
Try
SubProcess = Process.Start(oProg)
SubProcess.EnableRaisingEvents = True
Catch ex As Exception
MsgBox("Something went wrong")
End Try
End Sub
Private Sub AMTASProcess_Exited(ByVal sender As Object, ByVal e As System.EventArgs) Handles SubProcess.Exited
Results.Show()
End Sub
解决方案
a的Exited
事件Process
在辅助线程上引发。如果你想影响你的应用程序的 UI,你必须在 UI 线程上这样做。这意味着您需要编组对 UI 线程的方法调用,然后显示您的表单。最简单的方法是这样的:
Invoke(Sub() Results.Show())
这调用了Invoke
当前表单的方法。该Control.Invoke
方法调用线程上的委托,该线程拥有您调用它的控件的句柄,即 UI 线程。在这种情况下,被调用的委托是调用原始Results.Show
方法的 Lambda 表达式。
如果您想了解更多有关此主题的信息,可以查看此内容。
推荐阅读
- java - 制造商在谷歌地图上调用相同的活动
- mysql - 如何获取只有 1 个关系的实体?
- python - 使用 apply 向现有数据框添加 2 个新列
- android - Android Studio 3.5 原因:buildOutput.apkData 不能为空 Clean & Rebuild 已经尝试过
- javascript - 如何使用工厂函数模式访问 vuex 商店
- maven - 对于我的嵌套类型 maven 项目,我收到一条警告,为不同的模块提供不同的 groupid。IE。用于服务和 webapps 模块
- azure - 为什么 fluent-plugin-application-insights 设置为 [不支持]?
- css - 淡入时CSS过渡延迟,但淡出时无延迟
- autohotkey - 如何在热键等功能中使用逗号(,)?
- python - 如何在 PyQt4 中打印 QLCD Widget 的变化值?