WPF 多线程

2024-04-10

我正在绞尽脑汁地尝试让多线程在 WPF 中按照我想要的方式工作

我有一个名为 Manager 的对象(带有单例),它执行大量处理和查找。我希望它在与 UI 分开的线程中运行,UI 将调用 Manager 上的方法来执行 UI 应该做出反应的处理和触发事件

我正在从 Windows 窗体转换此应用程序,我认为这不是问题,因为文本框事件是在不同的线程中自动触发的。在 WPF 中则不然,一切似乎都停留在 UI 线程上。

如何使对象在不同的​​线程中“活动”,然后如何调用它的方法。我尝试在 Window 构造函数中使用它将其生成到一个新线程

        Thread managerThread = new Thread(new ThreadStart(ManagerStartingPoint));
        managerThread.SetApartmentState(ApartmentState.STA);
        managerThread.IsBackground = true;
        managerThread.Start();

and:

private void ManagerStartingPoint()
    {
        ManagerSingleton.Manager = new Manager();
        MediatorSingleton.Mediator = new Mediator();
    }

在文本框 textchanged 事件上,我调用 Manager.SetItemText(e.Value) ,逻辑上应该在新线程上调用它,对吧?当我键入并且事件触发 UI 时,仍然会“口吃”并且在文本框中键入内容会受到影响。我需要异步调用该方法还是其他什么?


您只是在后台创建这些对象;这并没有什么区别。您需要在后台调用您的方法:



public YourTextBox_TextChanged(...) {
    var bw = new BackgroundWorker();

    bw.DoWork += (sender, args) => {
        // do your lengthy stuff here -- this will happen in a separate thread
        Manager.SetItemText(e.Value)
    }

    bw.RunWorkerCompleted += (sender, args) => {
        if (args.Error != null)  // if an exception occurred during DoWork,
            MessageBox.Show(args.Error.ToString());  // do your error handling here

        // Do whatever you want to do after the SetItemText has completed.
        // We are back in the UI thread here.
        ...
    }

    bw.RunWorkerAsync(); // start the background worker
}
  

PS: 确保您的Manager.SetItemText方法是线程安全的!使用后台线程,很可能会出现多个实例Manager.SetItemText并行运行(如果第二个 TextChanged 事件在第一个 SetItemText 完成之前到达)。

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

WPF 多线程 的相关文章

随机推荐

  • 将每 2 个 div 包裹在一个新的 div 中

    假设我有这个 div class somediv div div class somediv div div class somediv div div class somediv div div class somediv div div
  • Qt Designer 不加载我的自定义小部件插件

    我正在阅读 使用 Qt4 进行 C GUI 编程 一书 并且已经达到了将自定义小部件与 Qt Designer 集成的主题 我已经构建了那里概述的示例项目 图标编辑器插件 并且我得到了一个名为 libiconeditorplugin so
  • 如何强制执行新的空 EF 迁移?

    好的 所以我完全依赖我的迁移和种子代码来维护所有数据库结构和初始数据 因此 我面临的情况是 我在此版本中所做的所有更改都是直接在数据库 存储过程和更新 上进行的 并且 C 代码本身没有任何更改 问题是 由于我想使用新的迁移来执行这些数据库特
  • 生产中的 GWT 源映射

    GWT 支持超级开发模式下的源映射 不幸的是 尽管我在 gwt xml 文件中添加了源映射选项 但它们似乎无法在生产模式下工作 如何在那里启用它们 看看 GWT 自己的网站是如何做到这一点的 https gwt googlesource c
  • 如何离线安装Flask? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我已经在我的电脑上下载了 Flask 然后我就断开了连接 现在我需要在没有互联网连接的情况下安装 Flask 离线安装 Flask 还需要什
  • Wildfly 中有多个持久单元?

    Wildfly 9 0 2 应用程序中是否可以有两个持久性单元 我收到 WFLYJPA0061 未指定持久性单元名称 并且应用程序部署部署 jasper web war 中有 2 个持久性单元定义 要么将应用程序部署更改为只有一个持久性单元
  • Java 中使用分隔符“.”的分词问题

    我需要使用分隔符分割文本 例如我想要这个字符串 Washington is the U S Capital Barack is living there 分为两部分 Washington is the U S Capital Barack
  • Spring Security 中具有密码授予的 oAuth2 客户端

    我正在使用一组受 oAuth2 保护的服务 目前的工作原理如下 客户端使用用户名和密码登录 我用这些换取代币 我将令牌保留在会话中 并在每次想要调用服务时提交它 它可以工作 但问题是我完全手动执行此操作 而没有使用 Spring Secur
  • 使用命令中断循环

    在我的 Python Discord Bot 中 我想创建一个命令 这会导致循环运行 当我输入第二个命令时 循环应该停止 那么粗略地说 client event async def on message message if message
  • Node.js 中多线程处理文件

    我需要从在线 url 读取文件并在多线程中处理它并将其写入另一个输出中 https www w3 org TR PNG iso 8859 1 txt https www w3 org TR PNG iso 8859 1 txt我尝试过的解决
  • 如何测量图像上绘制的线的长度? C#

    我想编写一个应用程序来测量在显微镜下检查的样本碎片 我认为最好的方法是捕获图像并在样本的选定部分上绘制 然后以像素为单位计算绘制线的值 然后将该值转换为适当的单位 是否有任何东西可以帮助解决已经实现的此类问题 或者有任何工具 包或允许此类计
  • C# LINQ 用有意义的字符串替换空值

    从列表中 class Delivery public string ProductCode get set public DateTime OrderedDate get set public DateTime DeliveryDate g
  • 如何在 iPhone 上运行的应用程序中浏览核心数据?

    我正在开发一个使用核心数据的 iPhone 项目 并试图找到一种方法来轻松浏览数据的存储方式 具体来说 我将图像存储在核心数据中 并想查看它们占用了多少空间等 我发现了一个名为 核心数据编辑器 的应用程序 可以让你在 iPhone 模拟器上
  • 将球体上的 3d 点转换为 UV 坐标

    我在球体上有一个 3d 点 想要将其转换为球体纹理上的 UV 点 有人可以指出正确的方向吗 我可以采用纯数学解决方案 Edit 我目前有这个 它不会返回正确的 UV 坐标 p 是球体上的 3d 点 mesh position 是球体的位置
  • Phoenix:订购查询集

    我 一个菜鸟 为了好玩而玩弄 Phoenix 框架并构建一个小型 Twitter 克隆 我一切正常 但是 我想按updated at字段 升序 正如您从 tweet controller 中看到的 我尝试过使用 order by 子句 但这
  • (MySQL) 在文件特定列中加载数据

    我在将数据加载到表的特定列时遇到问题 CSV 文件是动态构建的 具有默认字段 ID LAST REFRESH ALIAS1 和可能含有ALIAS2 至 ALIAS8 当前 CSV 仅包含 ALIAS1 4 MySQL 表包含 ID LAST
  • 在 64 位 Windows 计算机上使用 32 位 com 运行 32 位应用程序

    我有一个使用 C COM 对象的 C 应用程序 两者都构建在 32 位计算机上 现在我必须在 64 位机器上运行它们 我注册了COM对象 在计算机 hkey classes root wow6432node clsid xxx 下的寄存器中
  • C++ 中的嵌套 Lambda 捕获 [重复]

    这个问题在这里已经有答案了 我有类似的东西 think of Synonym as a set vector of values the purpose of this function is to filter out elements
  • Javascript 函数显示所遵循城市的路线

    我正在 codewars com 上练习编码 我碰到这个问题 https www codewars com kata 5899a4b1a6648906fe000113 train javascript 我们正在追踪我们的流氓特工马修 奈特
  • WPF 多线程

    我正在绞尽脑汁地尝试让多线程在 WPF 中按照我想要的方式工作 我有一个名为 Manager 的对象 带有单例 它执行大量处理和查找 我希望它在与 UI 分开的线程中运行 UI 将调用 Manager 上的方法来执行 UI 应该做出反应的处