我是一个新手程序员,所以我在这里可能完全误会了,但是这个问题让我感到不安。
这实际上是这个问题的后续行动。
公认的答案是,您必须调用 InvokeRequired 以避免一些开销,因为您有可能已经在 UI 线程上进行操作。
从理论上讲,我同意它可以节省一些时间。经过一些测试,我发现使用 Invoke 所花费的时间大约是正常调用操作的两倍(测试比如设置标签的文本 n 次,或者在 RichTextBox 中放置一个非常非常大的字符串)。
但!然后是练习。
MSDN 文档说:
此属性可用于确定是否必须调用调用方法,如果您不知道哪个线程拥有控件,这可能很有用。
在大多数情况下,您确实知道何时尝试从另一个线程访问控件。实际上,我能想到的唯一情况是,当从可以由线程 X 以及所有者线程调用的方法访问控件时。这对我来说是一个非常不可能的情况。
即使您真的不知道哪个线程试图操纵控件,也有一个事实是 UI 线程不必那么频繁地更新。25-30 fps 之间的任何内容都适合您的 GUI。并且在 UI 控件中所做的大多数更改都需要不到几毫秒的时间来执行。
因此,如果我理解正确,您必须检查是否需要调用的唯一情况是当您不知道哪个线程正在访问控件并且 GUI 更新需要超过 40 毫秒才能完成时。
然后是我在http://programmers.stackexchange.com上提出的这个问题的答案。这表明您不应该在不需要时忙于过早的优化。特别是如果它牺牲了代码的可读性。
所以这给我带来了我的问题:当你知道不同的线程访问控件时,你不应该只使用调用吗,并且只有当你知道你的 UI 线程可以访问那段代码并且你发现它应该运行得更快时,你应该检查是否需要调用?
PS:在校对我的问题后,听起来我真的在咆哮。但实际上我只是好奇为什么 InvokeRequired 似乎被许多比我更有经验的程序员过度使用。