Делегаты использовали в Темах? - PullRequest
1 голос
/ 19 марта 2009

Что происходит внутри, когда мы вызываем BeginInvoke для переменной типа делегата?

1 Ответ

2 голосов
/ 19 марта 2009

Это зависит от типа объекта, в котором вы вызываете BeginInvoke.

ISynchronizeInvoke - это интерфейс, который определяет BeginInvoke. Он передает делегат объекту, который реализует этот интерфейс, и этот объект будет (должен) планировать выполнение потока в своем собственном главном потоке.

Есть несколько объектов, которые реализуют этот интерфейс. Диспетчер в WPF делает это - когда вы вызываете BeginInvoke для диспетчера, делегат добавляется в очередь диспетчера и запускается, когда это уместно.

Базовый класс Control в Windows Forms также реализует ISynchronizeInvoke (и я полагаю, что это может быть то, на что намекал ваш вопрос). В Windows Forms все намного сложнее. Вот отличная статья , объясняющая детали. По сути, при вызове BeginInvoke для элемента управления winforms происходит то, что специальный маршаллер создает сообщение Windows, которое передается программе, а поток пользовательского интерфейса ставит в очередь делегата для запуска. Это немного сложнее, чем это (как описано в этой статье), но это основная идея. Затем делегат запускается в основном потоке пользовательского интерфейса.

Существуют другие объекты, которые реализуют ISynchronizeInvoke, но большинство из них являются объектами, которые управляют и запускают свои собственные потоки. Эти объекты поддерживают очередь делегатов и добавляют свою в эту очередь, чтобы она выполнялась в их потоке.

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