盲目使用 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 不是不好的做法吗? 的相关文章

  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 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