【发布时间】:2013-07-02 09:14:17
【问题描述】:
我是一个新手程序员,所以我在这里可能完全搞错了,但是这个问题让我感到不安。
这实际上是this问题的后续。
接受的答案是,您必须调用 InvokeRequired 以避免一些开销,因为您有可能已经在 UI 线程上进行操作。
理论上,我同意它可以节省一些时间。经过一些测试,我发现使用 Invoke 所花费的时间大约是正常调用操作的两倍(测试比如设置标签的文本 n 次,或者在 RichTextBox 中放置一个非常非常大的字符串)。
但是!然后是练习。
MSDN 文档说:
此属性可用于确定您是否必须调用调用方法,如果您不知道哪个线程拥有控件,这将很有用。
在大多数情况下,您确实知道何时尝试从另一个线程访问控件。实际上,我能想到的唯一情况是,当从可以由线程 X 以及所有者线程调用的方法访问控件时。这对我来说是一个非常不可能的情况。
即使您真的不知道哪个线程试图操纵控件,也有一个事实是 UI 线程不必那么频繁地更新。 25-30 fps 之间的任何内容都适合您的 GUI。在 UI 控件中进行的大多数更改只需几毫秒即可执行。
因此,如果我理解正确,您必须检查是否需要调用的唯一情况是当您不知道哪个线程正在访问控件以及 GUI 更新需要超过 40 毫秒才能完成时。
然后是我在http://programmers.stackexchange.com 上提出的this 问题的答案。这表明您不应该在不需要时忙于过早的优化。特别是如果它牺牲了代码的可读性。
所以这给我带来了我的问题:当您知道不同的线程访问控件时,您不应该只使用调用吗,并且仅当您知道您的 UI 线程可以访问那段代码时使用 并且您发现它应该运行得更快,您应该检查是否需要调用?
PS:在校对我的问题后,听起来我真的在咆哮。但实际上我只是好奇为什么 InvokeRequired 似乎被许多比我更有经验的程序员过度使用。
【问题讨论】:
-
你的帖子做得很好。
-
我大体上同意 - 如果您希望在非 UI 线程上进行调用,那么使用 InvokeRequired 将代码弄乱是没有意义的。
-
我的 2 美分:
InvokeRequired被如此频繁地使用是因为这些程序员做出了需要它的伤害体验,即使他们一开始就确定他们不需要它。他们学会了避免不得不考虑在特定情况下是否需要它,他们总是把它放进去。这使他们更有效率(花更少的时间试图弄清楚是否可能需要它,更少的时间花在稍后发现错误时修复代码)。这很好。这也使他们更少考虑自己在做什么。这很糟糕。 -
如您所见,我们对此表示赞赏。太多帖子低于标准。很高兴看到额外的努力。
-
作为一名对他人文档记录不佳的代码进行大量维护的开发人员,我讨厌多余的检查。 IME,我开发的从辅助线程和主 UI 线程调用显式 UI 方法的应用程序的数量大约为零。
标签: c# multithreading invoke invokerequired