Особое правило состоит в том, что вы не можете вызвать функцию Windows API, которая использует ручку окна. Не совсем очевидно, будет или нет использовать свойство или вызвать метод элемента управления, что вызовет такой вызов API. В документах MSDN перечислены только 4 из них, которые всегда безопасны для использования: InvokeRequired, Invoke(), BeginInvoke() и CreateGraphics().
Но да, иногда значение свойства доступно и не требует вызова API. Хорошим примером является свойство Text. Он кэшируется, потому что он используется так часто. Чтение Свойство Text не генерирует исключение, вы просто получаете кешированное значение. Но пишет Свойство текста переходит в kaboom, для обновления текста на экране требуется вызов API. ListView.VirtualSize работает точно так же.
Вы не получите исключение, но оно все еще не кошерное. В конце концов, поток пользовательского интерфейса может также изменить свойство Text, а позже - через микросекунду. Вы получите устаревшее значение, классическую проблему с потоками, известную как состояние гонки.
Исправьте меня, если я ошибаюсь, но чтение значения из другого потока ничего не обновляет, так что это возможно. Если вам нужно *** изменить *** что-то в пользовательском интерфейсе, вам нужно синхронизировать действие с потоком пользовательского интерфейса, используя диспетчер пользовательского интерфейса, например, если он доступен. –
Неважно, обновляете ли вы или нет. Важно то, что поток пользовательского интерфейса может обновлять данные, которые вы пытаетесь прочитать, а затем вы получаете поврежденные данные. –