Я начинающий программист, поэтому я мог быть полностью ошибаюсь здесь, но эта проблема больше меня беспокоит.
На самом деле это вопрос из этого вопроса.
Принятый ответ заключался в том, что вам нужно вызвать InvokeRequired, чтобы избежать некоторых накладных расходов, потому что есть вероятность, что вы уже работаете в потоке пользовательского интерфейса.
В теории я согласен, что это может сэкономить некоторое время. После некоторых тестов выяснилось, что использование Invoke занимает примерно в два раза больше времени, чем обычно вызов операции (тесты, такие как установка текста метки n раз или размещение очень большой строки в RichTextBox).
Но! Тогда есть практика.
Документация MSDN гласит:
Это свойство может использоваться для определения необходимости вызова метода invoke, который может быть полезен, если вы не знаете, какой поток принадлежит элементу управления.
В большинстве случаев вы do знаете, когда пытаетесь получить доступ к элементу управления из другого потока. На самом деле единственная ситуация, о которой я могу думать, - это доступ к элементу управления из метода, который может быть вызван потоком X, а также потоком владельца. И это для меня очень маловероятная ситуация.
И даже если вы действительно не знаете, какой поток пытается манипулировать элементом управления, есть тот факт, что поток пользовательского интерфейса не нужно часто обновлять. Все что угодно между 25-30 fps должно быть в порядке для вашего графического интерфейса. И большинство изменений, сделанных в пользовательских интерфейсах, занимают гораздо меньше миллисекунд, чтобы выполнить.
Итак, если я правильно понимаю, единственный сценарий, когда вам нужно проверить, требуется ли вызов, - это когда вы не знаете, какой поток обращается к элементу управления, и когда обновление GUI занимает более 40 мс.
Тогда есть ответ на этот вопрос, который я задал http://programmers.stackexchange.com. В котором говорится, что вы не должны быть заняты преждевременной оптимизацией, когда вам это не нужно. Особенно, если он жертвует удобочитаемостью кода.
Итак, это подводит меня к моему вопросу: не следует ли вам просто использовать invoke, когда вы знаете, что другой поток обращается к элементу управления, и только, когда вы знаете, что ваш поток пользовательского интерфейса может получить доступ к этому фрагменту кода и, вы обнаружите, что он должен работать быстрее, чтобы проверить, требуется ли Invoke?
PS: после проверки моего вопроса это действительно звучит так, как будто я разглагольствовал. Но на самом деле мне просто интересно, почему InvokeRequired, по-видимому, чрезмерно используется многими более опытными программистами.