2015-08-18 2 views
2

Могу ли я прочитать состояние управления (не менять) в темах, не-UI, как этотМогу ли я прочитать состояние управления в резьб без UI

if (!string.IsNullOrWhiteSpace(notifyIcon.BalloonTipText)) 
{ 
    // ... 
} 

Является ли это безопасно?

+0

Почему бы вам просто не попробовать? –

+3

@Clive DM Потому что это может быть какое-то неопределенное поведение – FrozenHeart

+0

Вы имеете в виду, прежде чем элементы управления инициализируются? –

ответ

2

См. this artice из журнала Visual Studio о многопоточности в WinForms.

Как объясняется на стр. 2, одна из проблем доступа к элементам управления пользовательского интерфейса из потока, отличного от потока, создавшего элемент управления, состоит в том, что в этом потоке нет насоса сообщений (или, по крайней мере, он не обязательно имеет один). «Чтение» состояния пользовательского интерфейса выполняется через оконные сообщения (например, WM_GETTEXT) так же, как и их запись, и это неправильно так же.

+0

NotifyIcon не является элементом управления, поэтому он также не имеет метода Invoke. Свойство BalloonTipText имеет очень простой getter/setter без каких-либо событийных вызовов или собственного доступа к окну. Я бы сказал, просто использовать простые замки здесь. – taffer

+0

@taffer - может быть, но это зависит от того, что вопрос ... это «Я могу прочитать состояние элементов управления в потоках, отличных от UI», или это может я иметь дело с NotifyIcon в не-UI нить? – Amit

1

В каждом элементе управления есть свойство «InvokedRequired». Проверьте это свойство, если оно ложно, вы можете вызвать метод обычным способом, иначе вызовите метод вызова с помощью делегата из элемента управления, к которому вы пытаетесь получить доступ.