盲目使用 InvokeRequired 不是不好的做法吗?

2023-12-26

我是一名新手程序员,所以我在这里可能完全错误,但这个问题让我烦恼的程度超出了应有的范围。

这实际上是后续this https://stackoverflow.com/questions/747210/whats-wrong-with-calling-invoke-regardless-of-invokerequired问题。

公认的答案是,您必须调用 InvokeRequired 以避免一些开销,因为您有可能已经在 UI 线程上进行操作。

理论上,我同意这可以节省一些时间。经过一些测试,我发现使用 Invoke 花费的时间大约是正常调用操作的两倍(例如设置标签文本 n 次,或者在 RichTextBox 中放置非常非常大的字符串)。

But!然后是练习。

MSDN 文档说:

此属性可用于确定是否必须调用调用方法,如果您不知道哪个线程拥有控件,这会很有用。

大多数情况下,你do知道您何时尝试从另一个线程访问控件。实际上我能想到的唯一情况是,当从线程 X 以及所有者线程可以调用的方法访问控件时。对我来说,这是一种非常不可能的情况。

即使您确实不知道哪个线程尝试操作该控件,事实上 UI 线程也不必频繁更新。 25-30 fps 之间的任何速度都适合您的 GUI。 UI 控件中所做的大多数更改只需不到几毫秒即可完成。

因此,如果我理解正确的话,您必须检查是否需要调用的唯一情况是当您不知道哪个线程正在访问控件以及 GUI 更新需要超过大约 40 毫秒才能完成时。

然后就有了答案this https://softwareengineering.stackexchange.com/questions/202530/question-regarding-readability-vs-processing-time我问的问题http://programmers.stackexchange.com http://programmers.stackexchange.com。这表明当你不需要时,你不应该忙于过早的优化。特别是如果它牺牲了代码的可读性。

所以这让我想到了我的问题:当您知道不同的线程访问控件时,您不应该只使用调用吗?only当你知道你的 UI 线程可以访问那段代码时and您发现它应该运行得更快,您应该检查是否需要调用?

PS:校对完我的问题后,听起来确实像我在咆哮。但实际上我只是好奇为什么 InvokeRequired 似乎被许多比我更有经验的程序员过度使用。


你在这里断章取义。第一个问题你链接了 https://stackoverflow.com/questions/747210/whats-wrong-with-calling-invoke-regardless-of-invokerequired链接了另一个问题,具体是关于写一个线程安全访问 UI 控件的方法。

如果您不需要对 UI 控件进行线程安全访问,因为您知道不会从另一个线程更新它,那么当然,您不应该使用此技术。只需更新您的 UI 控件而不使用InvokeRequired or Invoke.

另一方面,如果调用将always源自 UI 线程以外的线程,只需使用Invoke无需先检查InvokeRequired.

这导致三个简单的规则:

  1. 如果仅从 UI 线程更新控件,则两者都不使用InvokeRequired nor Invoke
  2. 如果仅从 UI 线程以外的线程更新控件,则仅使用Invoke.
  3. 如果您从 UI 线程和其他线程更新控件,请使用Invoke结合InvokeRequired.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

盲目使用 InvokeRequired 不是不好的做法吗? 的相关文章

  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum

随机推荐

  • Android 共享首选项在删除文件后仍然可见

    我正在尝试使用共享首选项的应用程序 当我从中删除首选项文件时数据 data com your package name shared prefs mySharedPref xml手动使用 Android 监视器 应用程序仍然能够读取首选项值
  • DataGridView 级联/相关组合框列

    因此 我时常在 Winforms 的遗留应用程序中工作 并不总是熟悉绑定对象的最佳实践 基本上我有一个三部分集 其中有两个人 他们可能只有一种产品 但该产品可能会导致拥有不同的 SKU 集 有没有办法从第一个组合框的值触发组合框的事件和填充
  • Java EE 中的拦截器是什么?

    我正在尝试澄清关于 Java EE 中的拦截器的概念 我已经阅读了 Java EE 规范 但我对此有点困惑 请为我提供一些有用的链接或教程 以澄清我的概念 我们如何 何时 为何使用拦截器 拦截器用于实现业务逻辑中的横切关注点 例如日志记录
  • 从 activemq 主题获取消息时,logstash 输入速度非常慢

    我已经在logstash中配置了JMS输入来订阅JMS主题消息并将消息推送到弹性搜索 input jms id gt my first jms yaml file gt D softwares logstash 6 4 0 config j
  • 访问派生类中的受保护成员

    我昨天遇到了一个错误 虽然很容易解决 但我想确保我正确理解了 C 我有一个带有受保护成员的基类 class Base protected int b public void DoSomething const Base that b tha
  • 如果我从不将 MutexGuard 分配给变量,那么它在哪里?

    我不明白 哪里 MutexGuard在内部代码块中是 互斥锁被锁定并展开 产生MutexGuard 不知何故 这段代码设法取消引用MutexGuard然后可变地借用该对象 哪里去了MutexGuard去 另外 令人困惑的是 这种取消引用不能
  • usockets:打开套接字时如何指定外部格式

    我正在尝试连接到 mud 客户端 因此我使用 usockets 通过 tcp 连接 但是在我写完之后 我得到了解码错误读数 我有理由相信编码应该为 ascii 或者至少使用 clrf 作为行尾指示符 因为在我读到的行上 行尾之前有一个 M
  • RESTful Web 服务和 HTTP 动词

    服务器应允许将 Web 服务归类为 RESTful 的最小 HTTP 动词集是什么 如果我的主机不允许怎么办PUT and DELETE 这真的很重要吗 我能从此过上幸福的生活吗 GET and POST Update 谢谢各位的解答 罗杰
  • 从 const 成员函数返回非常量引用

    为什么返回对指向的成员变量的引用有效 而另一个则无效 我知道一个const成员函数应该只返回const引用 但是为什么对于指针来说这似乎不正确呢 class MyClass private int a int b public MyClas
  • java.io.IOException:错误= 11

    我在使用 Java 时遇到了一个奇怪的问题ProcessBuilder 代码如下所示 稍微简化的形式 public class Whatever implements Runnable public void run someIdentif
  • 如何写入在 res/raw 中声明的文件中?

    我有一个文件存储在 res raw 中 我想知道如何写入该文件 我尝试了 getResources 但它返回一个 inputStream 不可能 如果您需要将资产复制到设备 请将文件存储在资产目录中 然后使用 AssetManager 流式
  • 如何通过改造发出 CURL 请求?

    我正在尝试登录 该请求看起来像这样 curl u username PASSWORD https urlhere com https urlhere com 我怎样才能使用改造使其发挥作用 我尝试了一个授权标头 例如 request add
  • 通过引用混淆赋值

    我有一个 交易 对象 其中包含对 orderBook BTCUSDT 的引用 我的目的是在 orderBook BTCUSDT 更改时更改 交易 但是 更改 orderBook BTCUSDT 不起作用 但更改 orderBook BTCU
  • 无法访问asp.net中的嵌入资源

    我正在尝试将图像和样式表从用户控件移动到程序集中的嵌入资源 我已使用 Reflector 来查看图像和 css 文件是否嵌入到程序集中 但是当我尝试使用 ClientScript GetWebResourceUrl 创建的 URL 访问它们
  • 如何在 Sequelize 的“BelongsTo”关联中设置外键的默认值或选项?

    我在续集方面遇到了一个看似常见的问题 对于上下文我试图分配一个默认值role每一个user即被创建 基本上每个user的角色应该设置为default user当他们第一次注册时 我希望能够像使用普通字段一样在模型文件中简单地定义此默认值 但
  • 对 Post 请求的两次调用:使用 http 204 和 200

    我已经在 net核心应用程序中实施了Cors策略 在Startup cs under ConfigureServices我添加了以下 cors 策略 services AddCors options gt options AddPolicy
  • QtWidgets 应用程序的虚拟键盘或屏幕键盘?

    我将部署qtvirtualkeyboard在我基于小部件的应用程序中 如下所示 include
  • 如何在 Rails 4.2 和 sqlite 中按星期几进行过滤?

    如何按一周中的每一天检索记录 这是我的范围 scope day of week gt day of week where created at day of week 我尝试过 strftime w day of week 和 DAYOFW
  • 以编程方式设置区域设置不起作用?

    我有一个活动 我以编程方式将区域设置设置为 de 但它没有按预期工作并显示手动设置的默认语言 英语文本 请帮忙 public void onCreate Bundle savedInstanceState super onCreate sa
  • 盲目使用 InvokeRequired 不是不好的做法吗?

    我是一名新手程序员 所以我在这里可能完全错误 但这个问题让我烦恼的程度超出了应有的范围 这实际上是后续this https stackoverflow com questions 747210 whats wrong with callin