C# GUI 线程错误

2023-12-28

我正在开发一个应用程序,它应该通过套接字接口接收命令,然后在 GUI 中执行它们。该应用程序正在 C# .NET 4.0 中开发,并使用 WPF 作为其 GUI。

套接字接口有一个工作线程,它不断侦听套接字并处理其命令,因此,如果收到“显示弹出窗口”命令,则工作线程会调用一个管理器类,该管理器类负责创建弹出窗口并将其显示在主屏幕上。

创建弹出窗口然后调用主屏幕的管理器方法如下:

public void ProcessPopup(PopupModel model)
{
    switch (model.ScreenType)
    {
        case Screens.Type1:
            popup = new PopupType1();
            break;
        case Screens.Type2:
            popup = new PopupType2();
            break;
        case Screens.Type3:
            popup = new PopupType3();
            break;
        case Screens.Type4:
            popup = new PopupType4();
            break;
    }

    viewModel.SetModel(model);

    if (!Dispatcher.CurrentDispatcher.Equals(App.Current.Dispatcher))
    {
        App.Current.Dispatcher.Invoke((ThreadStart)delegate { mainScreen.ShowPopup(popup); });
    }
    else
    {
        mainScreen.ShowPopup(popup);
    }
}

PopupType1 类是:

public partial class PopupType1 : UserControl
{
    public PopupType1 ()
    {
        InitializeComponent();
    }
}

问题是,当我创建新的 Popup Type 1 对象时,出现以下异常:

System.InvalidOperationException: The calling thread must be STA, because many UI components require this.
   at System.Windows.Input.InputManager..ctor()
   at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
   at System.Windows.Input.InputManager.get_Current()
   at System.Windows.Input.KeyboardNavigation..ctor()
   at System.Windows.FrameworkElement.FrameworkServices..ctor()
   at System.Windows.FrameworkElement.EnsureFrameworkServices()
   at System.Windows.FrameworkElement..ctor()
   at System.Windows.Controls.Control..ctor()
   at System.Windows.Controls.UserControl..ctor()
   at MyApp.Views.PopupType1..ctor()
   at MyApp.Manager.ProcessPopup(PopupModel model)
   at MyApp.CommunicationController.ProcessAsync(XDocument messageXml)

我已经尝试过几种方法,例如将工作线程转换为 STA 线程,或者创建一个新的 STA 线程来处理 Popup 的创建,但它们造成的问题比解决的问题还要多。

最后值得一提的是,我正在这样做,因为我的应用程序在运行过程中遇到了几次“冻结”,我相信它们与 WPF GUI 线程因任务过多而无法正确响应这一事实有关,因此我试图将非 GUI 处理与 GUI 线程分开。


您还需要在 UI 线程上创建 UI 控件。所以基本上所有的ProcessPopup在您的情况下需要在 UI 线程上执行,而不仅仅是mainScreen.ShowPopup()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# GUI 线程错误 的相关文章

随机推荐

  • JavaScript:回调函数参数与其他变量同名?

    var str internet performAction function str console log str 私有变量有问题吗str并且还有一个带有同名参数的回调函数 Thanks 这只是一个标准范围的情况 它是作为参数传递给另一
  • Android 机器未联网

    当我的应用程序连接到 WiFi 网络时 我在运行网络服务时遇到问题 我收到以下异常 java net SocketException socket failed ENONET Machine is not on the network 在下
  • 是否可以在不使用图像映射软件的情况下获得图像映射的坐标?

    我正在学习 html css 令我困惑的一件事是图像映射的想法 我该如何获取图像一部分的坐标并将其插入我的区域标签而不使用像 gimp 这样的图像映射软件 使用 gimp 的图像映射工具确实很有用 但我担心将来我需要知道如何在没有 gimp
  • 在 python 中从密码生成 RSA 密钥

    我希望能够生成并再生相同的 RSA 密钥password 和盐 单独在python 目前我正在使用 pycrypto 进行此操作 但是 它似乎并不能单独从密码生成相同的密钥 原因似乎是当 pycrypto 生成 RSA 密钥时 它在内部使用
  • 带有结构和空元胞数组的 MATLAB“bug”(或非常奇怪的行为)

    我不知道这里发生了什么事 我用的是R2006b 在我提交错误报告之前 拥有较新版本的人是否有机会测试一下他们是否获得相同的行为 code bug1 m function bug1 S struct nothing something add
  • JavaScript 正则表达式替换字符序列

    我想在这种特定情况下用下划线替换字符串开头和结尾的所有空格 var a console log myReplace a prints 即 第一个 之前的字符串开头的所有空格以及最后一个 之后的所有空格 其他所有内容 包括字符串中间的空格 保
  • Django/Python 循环模型参考

    好的 所以我正在尝试编写组织良好的代码 并实际制作单独的 django 应用程序 而不是将所有内容集中到 1 个应用程序中 我的问题是我有 3 个应用程序 每个应用程序都引用下一个应用程序中的 1 个其他模型 所以基本上我有一个无限循环 应
  • 如何在matplotlib中制作较粗的茎线

    我想在使用时在 python 中制作更粗的茎线plt stem 这是我的代码 import matplotlib pyplot as plt import numpy as np N 20 n np arange 0 2 N 1 x np
  • 静态块与静态方法 - 初始化静态字段

    出于好奇 我测量了静态块和静态方法初始值设定项之间的性能 首先 我在两个单独的 java 类中实现了上述方法 如下所示 First class Dummy static java util List
  • Glassfish 中的休眠 - Ejb3Configuration NoClassDefFoundError

    我已将 Hibernate 库放入 Glassfish 域和 Netbeans 项目的库集合中 hibernate entitymanager jar包含 HibernatePersistence 调用堆栈中的最后一个类 和 Ejb3Con
  • 带选择框的 Struts2 jQuery 自动完成器

    我使用过 Struts2 jQueryautocompleter对于我的 Struts 2 应用程序 这是我的代码 JSP
  • 所有 Python 脚本停止工作:macOS Monterey 12.6 更新后所有项目中的路径均已更改

    今天将 macOS Monterey 更新到 12 6 后 我所有的 Python 项目 脚本都停止工作 在我的项目的 venv 之一中检查 Python 二进制文件的符号链接 我看到原始文件是 Library Developer Comm
  • 使用 unity 解析具有多个构造函数的实例

    我想使用 unity 创建一个类的实例 其中该类有两个参数数量相同的构造函数 这是实例化 unityContainer Resolve
  • 部署到tomcat的war无法抛出java.lang.NoClassDefFoundError: javax/persistence/PersistenceException

    我是这个论坛的新手 也是 JPA EJB 的新手 我正在尝试将包含小型应用程序的 war 文件部署到 tomcat 服务器 该应用程序使用 JTA 与 Derby 数据库进行通信 当我在 eclipse 中运行的 tomcat 服务器上运行
  • 无法加载本机 TensorFlow 运行时 - TensorFlow 2.1

    我有一台台式电脑和一台笔记本 当我尝试在笔记本上安装tensorflow时 只需使用pip 安装张量流它工作正常 然后我在我的台式计算机上尝试了相同的操作 当我尝试运行最简单的代码时 import tensorflow as tf from
  • 这段代码会做什么? (内存管理)

    char p new char 200 char p1 p char p2 p 100 delete p1 顺便说一句 这不是一个测试 也不是我真正需要知道的任何事情 allocate memory for 200 chars p poin
  • 安全随玩!来自外部应用程序

    我正在努力使用 Play 编写一个私有 REST API 我将从移动应用程序拨打电话 但我对如何保证其安全感到困惑 在研究 Play 文档中的 Yet Another Blog Engine 示例时 我研究了他们的认证示例 http www
  • 方法内的处理程序会泄漏内存吗?

    我知道在类中声明的处理程序可能会泄漏内存 因为它保存了对其外部类的引用 在这种情况下 我们应该使用弱引用的静态嵌套类 但是如果在方法内部声明处理程序怎么办 我遇到了下面的情况 不确定它是否是正确的实现 有人可以解释一下或给我提示吗 我什至不
  • 如何编辑 web.config 以停止提供 .NET Web 应用程序的特定文件类型

    我想阻止用户通过浏览器访问某种类型的文件 例如 IIS 服务器默认阻止对 config 和 vb 文件的访问 给出错误消息 未提供您请求的页面类型 因为它已被明确禁止 并且我想添加其他文件类型到此行为 我可以在应用程序的 web confi
  • C# GUI 线程错误

    我正在开发一个应用程序 它应该通过套接字接口接收命令 然后在 GUI 中执行它们 该应用程序正在 C NET 4 0 中开发 并使用 WPF 作为其 GUI 套接字接口有一个工作线程 它不断侦听套接字并处理其命令 因此 如果收到 显示弹出窗