Поток без пользовательского интерфейса, доступ к пользовательскому интерфейсу - PullRequest
1 голос
/ 08 ноября 2010

Общеизвестно, что вы не можете обновить пользовательский интерфейс из какого-либо другого потока, кроме потока пользовательского интерфейса.

Однако я только что обнаружил некоторый код, который получает значение виртуального размера списка, из потока без пользовательского интерфейса без исключения.

Так что на самом деле мой вопрос: какое взаимодействие вы можете иметь с пользовательским интерфейсом из не-пользовательского потока?

Спасибо Тео

Ответы [ 2 ]

5 голосов
/ 08 ноября 2010

Поскольку он работает без исключения, это не значит, что вы должны это делать.

Проблема заключается в том, что помимо требования Invoke для методов, обновляющих пользовательский интерфейс, эти элементы управления также не поддерживают многопоточность. Это означает, что когда поток пользовательского интерфейса обновляет данные во время их извлечения, вы получаете поврежденные данные.

3 голосов
/ 08 ноября 2010

Особое правило заключается в том, что нельзя вызывать функцию Windows API, которая использует дескриптор окна.Не совсем очевидно, будет ли использование свойства или вызова метода элемента управления таким вызовом API.В документах MSDN перечислены только 4 из них, как всегда безопасных для использования: InvokeRequired, Invoke (), BeginInvoke () и CreateGraphics ().

Но да, иногда значение свойства доступно и не требует APIвызов.Свойство Text является хорошим примером.Он кэшируется, потому что используется так часто. Чтение Свойство Text не создает исключение, вы просто получаете кэшированное значение.Но при записи свойство Text переходит в kaboom, для обновления текста на экране требуется вызов API.ListView.VirtualSize работает точно так же.

Вы не получите исключение, но оно все еще не кошерное.В конце концов, поток пользовательского интерфейса может также изменить свойство Text через микросекунду.Вы получите устаревшее значение, классическую проблему многопоточности, известную как условие гонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...