我是一名新手程序员,所以我在这里可能完全错误,但这个问题让我烦恼的程度超出了应有的范围。
这实际上是后续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 似乎被许多比我更有经验的程序员过度使用。