Почему я должен вызывать Control.Invoke из не-пользовательского потока? - PullRequest
0 голосов
/ 21 июля 2010

Почему я должен вызывать Control.Invoke из не-пользовательского потока? Как я знаю, любые манипуляции с контролем - это сообщения для контроля. Поэтому, когда я вызываю, например, TextBox.Text = "text", он выдаст сообщение SendMessage (TextBox.Hanlde ...). Это сообщение будет помещено в очередь сообщений потока пользовательского интерфейса и отправлено потоком пользовательского интерфейса. Почему я должен вызвать invoke, даже если он выдаст то же сообщение?

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Существует две причины, по которым разработчики MS сделали это ограничение:

  1. Некоторые функции пользовательского интерфейса имеют доступ к локальному хранилищу потоков (TLS).Вызов этих функций из другого потока дает неверные результаты для операций TLS.

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

С нашей точки зрения, нам просто нужно следовать этим правилам.

1 голос
/ 21 июля 2010

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

Обновление: для ответа на ваш вопрос, у вас нет для использования Control.Invoke - если у вас есть код, чтобы перенаправить ваш вызов в нужную ветку и отправить сообщение на насос сообщений - тогда используйте это. Это, однако, известно как переизобретение колеса. Если вы не делаете что-то, что меняет поведение.

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