我是一名新手程序员,所以我可能完全错了,但这个问题困扰着我。
实际上,这是对这个问题的跟进。
被接受的答案是,你必须调用InvokeRequired来避免一些开销,因为有可能你已经在UI线程上操作。
从理论上讲,我同意这可以节省一些时间。经过一些测试,我发现使用Invoke大约要比正常调用一个操作花费两倍的时间(像n次设置标签的文本或在RichTextBox中放置一个非常大的字符串等测试)。
但是!然后就是实践。
MSDN文档说:
此属性可用于确定是否必须调用调用方法,如果您不知道哪个线程拥有控件,则此属性可能很有用。
在大多数情况下,当你尝试从另一个线程访问控件时,你知道它。实际上,我唯一能想到的情况是当控件从可以被线程X和所有者线程调用的方法访问时。而那对我来说是非常不太可能的情况。
而且,即使你真的不知道哪个线程试图操作控件,UI线程也不必那么频繁地更新。25-30 fps之间的任何东西都应该对你的GUI没问题。大多数在UI控件中进行的更改需要花费远远少于毫秒的时间来执行。
因此,如果我理解正确,唯一需要检查是否需要调用Invoke的情况是当你不知道哪个线程正在访问控件,并且GUI更新需要超过约40毫秒才能完成时。
接下来是我在http://programmers.stackexchange.com上提出的问题(链接)的答案。它表明当你不需要时,不应该忙于过早地进行优化。尤其是如果这会牺牲代码的可读性。
那么这就引出了我的问题:难道当你知道不同的线程访问控件并且只有当你知道你的UI线程可以访问代码的那部分并且你发现它应该运行得更快时,你才应该使用invoke吗?此外,你是否应该检查是否需要Invoke?
PS:在校对我的问题后,它听起来像是我在抱怨。但实际上我只是好奇为什么InvokeRequired似乎被许多比我经验丰富的程序员过度使用。
InvokeRequired
如此频繁地使用,是因为这些程序员曾经有过这样的伤痛经历,即使他们一开始确信不需要它。他们学会了避免在特定情况下思考是否需要它,而是总是将其放在代码中。这使他们更加高效(减少尝试确定是否需要它的时间,减少后来修复代码时花费的时间)。这很好。但同时也会让他们思考得更少,这是不好的。 - Treb