为什么只允许UI线程修改UI?

2023-12-11

我知道,如果我从不同的线程修改控件,我应该小心,因为 WinForms 和 WPF 不允许从其他线程修改控件的状态。

为什么会有这样的限制?

如果我可以编写线程安全代码,我应该能够安全地修改控件状态。那么为什么会有这样的限制呢?


一些 GUI 框架有这个限制。据书上说Java 并发实践这样做的原因是为了避免复杂的锁定。问题是 GUI 控件可能必须对来自 UI、数据绑定等的事件做出反应,这会导致来自多个不同源的锁定,从而存在死锁的风险。为了避免这种情况,.NET WinForms(和其他 UI)将对组件的访问限制为单个线程,从而避免锁定。

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

为什么只允许UI线程修改UI? 的相关文章

  • c# - 显示小数点到小数点后 6 位 [重复]

    这个问题在这里已经有答案了 可能的重复 具有 N 个小数位的 Double ToString https stackoverflow com questions 3059759 double tostring with n number o
  • C# 测试活动的互联网连接。 Ping google.com

    C 2008 我正在使用此代码来测试互联网连接 因为我的应用程序必须登录到网络服务器 但是 如果用户互联网连接失败或电缆被拔出 我必须通知用户 Ping www google com to check if the user has a i
  • binary_log_types.h:没有这样的文件或目录

    我正在编译一个小型 mysql C 项目并且 遇到以下错误 C Program Files x86 MySQL MySQL Server 5 7 include mysql com h 22 30 fatal error binary lo
  • 计算复杂数组的abs()值的最快方法

    我想计算 C 或 C 中复杂数组元素的绝对值 最简单的方法是 for int i 0 i lt N i b i cabs a i 但对于大向量来说 速度会很慢 有没有办法加快速度 例如使用并行化 语言可以是 C 或 C 鉴于所有循环迭代都是
  • 在目标 VS 安装时,VSIX 扩展内部使用的 WPF-Log4Net 未输出日志

    当 Log4net 在 VSIX 扩展中使用并安装在另一个目标 VS 上时 它不会记录日志 我有一个 WPF 解决方案 我下载了 log4net dll 添加了 log4net config 并将 复制到输出目录 值设置为 始终复制 log
  • 我的 WPF 应用程序未触发 MainWindow_Loaded

    我目前正在关注Pluralsight C Fundamentals Part 1并在Classes and Objects视频部分指导我在 Visual Studio 中创建一个新的 WPF 应用程序并填写代码 这导致以下结果 namesp
  • 修剪 UIImage 边框

    这是我想要修剪的图像的示例 我想去掉图像周围的边框 在本例中是顶部和底部的黑条 我在Github上找到了一个库 CKImageAdditions https github com cmkilger CKImageAdditions 但是它似
  • 多维数组和指向指针的指针

    创建多维数组时char a 10 10 根据我的书 它说你必须使用类似于char a 10 将数组传递给函数 为什么必须这样指定长度 您不是只是将双指针传递给 with 并且该双指针不是已经指向分配的内存吗 那么为什么参数不能是char a
  • 函数指针上的未知类型 F TYPE

    include
  • EF Core 一对多关系列表返回 null

    我正在尝试学习如何在 EF Core 中正确利用 DbContext 我有一个团队课程 public class Team public int ID get set public string Name get set public bo
  • 如何在Azure功能中添加razor视图文件?

    我正在创建一个应用程序 它是 azure 函数项目 我想在该项目中使用 Razor 视图 我应该在 azure 函数中使用任何模板引擎吗 得益于一些方面的进步剃刀之光项目 https github com toddams RazorLigh
  • 为什么这个单独的定义会导致错误?

    挑战 我有这段代码无法编译 你能找出问题所在吗 有一次让我很头疼 header namespace values extern std string address extern int port cpp file std string v
  • 从视图模型调用方法的命令

    好吧 我倾向于避免使用命令 因为它们总是让我感到困惑 但我正在进行一个新项目 并且正在尝试正确构建它 并且在我看来没有任何代码隐藏 基本上我现在想做的就是连接一个按钮来触发一个命令 在我的视图模型上执行一些操作 但不知何故 如此简单的事情仍
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • 为什么必须通过 this 指针访问模板基类成员?

    如果下面的类不是模板 我可以简单地拥有x in the derived班级 但是 通过下面的代码 我have to use this gt x Why template
  • C++ 联合数组和变量?

    在C 中没有办法做这样的事情吗 union Scalar x y Scalar v 2 Where x v 0 and y v 1 既然您使用的是 C 而不是 C 并且它们具有相同的类型 为什么不直接将 x 设为对 v 0 的引用 将 y
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • 如何创建和使用类箭头运算符? [复制]

    这个问题在这里已经有答案了 因此 在到处研究之后 我似乎找不到如何创建类箭头运算符 即 class Someclass operator gt 我只需要知道如何使用它并正确使用它 它的输入是什么 它返回什么 我如何正确地声明 原型化它 运算
  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式

随机推荐

  • Outlook 事件 newMail (newItem)

    我正在使用 Outlook 2003 我搜索了一种在创建新邮件时获取事件的方法 当创建新邮件的窗口时 注意 我搜索了各种将菜单添加到新邮件窗口的方法 此示例代码应放置在 ThisOutlookSession 模块中 重新启动 Outlook
  • Git - 仅克隆存储库的一部分并仅获取该部分的拉取?

    假设我有两个具有特定模块 或子目录 的存储库 如下所示 repo1 module1 module2 module3 repo2 module4 module5 因此 在我的测试服务器上 我按原样加载这些存储库 而且没问题 因为我获得了所有代
  • 文件上传期间显示进度条

    我有一个异步任务 应该在文件上传期间显示进度 一切正常 只是看起来它完成文件上传的速度非常非常快 然后它只是坐在那里 100 等待 我追踪到这一点 URL url new URL urlServer connection HttpURLCo
  • 在 ajax 加载的页面中无限滚动

    我有一个页面 我们称之为 1 php 它使用 jQuery ajax 将 2 php 加载到 div 框中 2 php 从我的数据库打印 20 条记录 当我滚动到达 div 框的底部时 我希望它加载接下来的 20 条记录 就像 Facebo
  • JSONObject 无法转换为 JSONArray

    我的 Android 应用程序需要使用以下 Java 从我的 WCF 服务获取用户名数组 然后填充微调器 JSONArray mtUsers new JSONArray new String buffer 但当我收到以下错误时 它似乎正在获
  • 在android上使用smsManager.sendTextManager发送短信的问题

    我正在从我的应用程序向使用 5 位数手机号码的服务器发送一条短信 在 4 2 2 操作系统上 它会在下面弹出窗口询问我 Edited 问 如何处理取消 确定按钮 这应该有效 switch getResultCode if cancel pr
  • 删除目录中的所有文件和文件夹

    我想要一个批处理文件 该文件将删除我的无线工具包的缓存文件夹中的所有文件夹和文件 目前我有以下内容 cd C Users tbrollo j2mewtk 2 5 2 appdb RMS del db 这将删除我的所有 db 文件RMS目录
  • fwrite() 性能远低于磁盘容量

    我有一个动态分配的数组struct拥有 1700 万个元素 为了将其保存到磁盘 我写 fwrite StructList sizeof Struct NumStructs FilePointer 在稍后的步骤中 我用等效的内容阅读了它fre
  • 在 Tensorflow 中重用 LSTM 的重用变量

    我正在努力使RNN using LSTM 我做了LSTM模型 后面有两个DNN网络和一个回归输出层 我训练了我的数据 最终的训练损失约为0 009 然而 当我将模型应用于测试数据时 损失变为大约0 5 第 1 轮训练损失约为0 5 所以 我
  • Jquery 从文本中提取 URL

    我需要使用 jquery 从文本中提取 URL 可以说我在页面上的某个地方遵循文本区域代码
  • 多视图应用程序的knockoutjs模式示例[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在构建一个应用程序 其中包含两个复杂的 显着不同的 但具有一些共享组件 视图 一个视图允许用户运行查询并查看搜索结果 另一个视图提供最近活动的概述 相关示例可能是具有电子邮件屏幕
  • Android Studio-Java.exe 已完成,退出值非零 2

    当我尝试运行我的应用程序时 我收到此错误 Error Execution failed for task app dexDebug gt com android ide common process ProcessException org
  • 在 Ajax Adob​​e AIR 应用程序中与 API 共享机密

    我对开发 AIR 应用程序还很陌生 所以也许这是一个愚蠢的问题 但我似乎无法从 Google 找到任何答案 非常感谢您能给我的任何帮助 我正在使用 Ajax 构建一个 AIR 应用程序 使用的 API 与 flickr 的 API 相同 并
  • Google 地图地理编码(GLatLng 地址)

    我正在尝试使用 Google Maps JavaScript API 从两个位置绘制测地折线address点 var polyOptions geodesic true var polyline new GPolyline new GLat
  • 无法写入从两个压缩数据帧创建的 PySpark 数据帧

    我正在尝试跟随这里给出的例子用于组合两个数据框没有共享连接密钥 通过数据库表或 pandas 数据框中的 索引 进行组合 但 PySpark 没有该概念 My Code left df left df repartition right d
  • 安装了 Ruby on Rails,但是当我尝试运行 Rails Sever 时它没有加载 WEBrick?

    我今天在我的 mac 上安装了 Ruby on Rails 以及 Gems 和 MYsql 我正在尝试遵循 lynda com 教程 但遇到了困难 当我尝试运行 Rails 服务器时 由于某种原因它没有加载 WEBrick 这是我得到的错误
  • Pandas Dataframe - 根据两列找到最小值但大于0的行

    我有一个包含 3 列的数据框 x y 时间 有几千行 我想要做的是检索时间最短的行 但我希望最小值不应该为 0 e g x y time 240 1 28 5 240 2 19 3 240 240 0 240 19 9 7 到目前为止我已经
  • dyld:找不到符号:__TMPdCSs12AnyGenerator

    当我尝试构建并运行我的项目时 它给了我一个错误symbol not found TMPdCSs12AnyGenerator 我已经在我的系统上安装了 Xcode 7 beta 当我安装时它给我一个错误未找到领域模块所以我只是删除了领域框架
  • 如何对合并光标进行排序?

    任务是将来自 2 个具有相似列的不同表的数据组合起来 并按一列排序 看起来 MergeCursor 可能会有所帮助 但不知道如何对项目进行排序 我现在看到的唯一解决方案是手动转换为 ArrayAdapter 或者进行偷偷摸摸的 JOIN 尚
  • 为什么只允许UI线程修改UI?

    我知道 如果我从不同的线程修改控件 我应该小心 因为 WinForms 和 WPF 不允许从其他线程修改控件的状态 为什么会有这样的限制 如果我可以编写线程安全代码 我应该能够安全地修改控件状态 那么为什么会有这样的限制呢 一些 GUI 框