почему доступ к классу пользовательского контроля не безопасен из другого потока? - PullRequest
2 голосов
/ 11 ноября 2010

Как видно из заголовка, почему доступ к классу пользовательского управления не безопасен из другого потока?Я слышал, что есть способ включить многопоточный доступ, и я думаю об этом ... Есть мысли, почему я не должен?

Ответы [ 3 ]

7 голосов
/ 11 ноября 2010

Взгляните на это:

http://msdn.microsoft.com/en-us/library/ms171728.aspx

Доступ к элементам управления Windows Forms не по своей природе потокобезопасен. если ты манипулировать двумя или более потоками состояние контроля, возможно заставить контроль в противоречивое состояние. Другой возможны связанные с потоками ошибки, такие как гоночные условия и тупики. Это важно убедиться, что доступ к вашему контролю выполняется в потокобезопасный способ.

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

Разрешение доступа к элементу управления WinForms из другого потока (то есть того, в котором он не был создан) может привести к тупикам и условиям гонки. Два потока, которые работают одновременно, оба пытаются обновить один и тот же элемент управления, могут в конечном итоге ждать завершения друг друга, прежде чем они смогут что-либо сделать. (См. MSDN .) WinForms защищает вас от подобных скрытых ошибок.

Если вы хотите, вы можете легко указать потоку элемента управления, что вы хотите, чтобы он обновил элемент управления, используя метод BeginInvoke и передав ему делегат:

myUserControl.BeginInvoke(myUserControl.PaintItBlack);

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

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

Экземпляры UserControl имеют сходство потоков с «потоком пользовательского интерфейса», что потребует маршалинга назад и вперед при попытке перехода от потенциального рабочего потока к потоку пользовательского интерфейса.

Кроме того, компонент безопасности потока является чем-то совершенно другим, поскольку, например, все переменные-члены необходимо будет синхронизировать в случае, если один экземпляр UserControl совместно используется несколькими потоками, следовательно, потенциально также доступен.

Можно ли это сделать? В теории да ... это должно быть сделано? Не обязательно. Я хотел бы вернуться к вашему дизайну и спросить, зачем вам это нужно в UserControl. Должно появиться разделение интересов, и, возможно, вы сможете извлечь из UserControl трудоемкие задачи, что избавит вас от этого бремени.

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