首页 > 解决方案 > 外部程序退出后出现“调用线程必须是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

标签: vb.net

解决方案


a的Exited事件Process在辅助线程上引发。如果你想影响你的应用程序的 UI,你必须在 UI 线程上这样做。这意味着您需要编组对 UI 线程的方法调用,然后显示您的表单。最简单的方法是这样的:

Invoke(Sub() Results.Show())

这调用了Invoke当前表单的方法。该Control.Invoke方法调用线程上的委托,该线程拥有您调用它的控件的句柄,即 UI 线程。在这种情况下,被调用的委托是调用原始Results.Show方法的 Lambda 表达式。

如果您想了解更多有关此主题的信息,可以查看此内容。


推荐阅读