C #: Где работает Control.BeginInvoke? - PullRequest
       25

C #: Где работает Control.BeginInvoke?

1 голос
/ 16 сентября 2009

Что именно делает этот метод? Я думал, что, возможно, он вышел в отдельный поток, но обрабатывал такие вещи, как обновление управления в правильном потоке. Но теперь я начинаю думать, что, возможно, он просто работает в потоке пользовательского интерфейса. Что означает, что вызов BeginInvoke для элемента управления из пользовательского интерфейса во многом аналогичен вызову Invoke? Или

Ответы [ 4 ]

5 голосов
/ 16 сентября 2009

Он в основном добавляет делегата в очередь «задач для выполнения». Поток пользовательского интерфейса выполняет эти задачи по порядку.

Разница между Control.Invoke и Control.BeginInvoke заключается в том, что Control.Invoke блокирует рабочий поток до тех пор, пока задача не будет выполнена в потоке пользовательского интерфейса, тогда как BeginInvoke - нет. Я не уверен от руки , есть ли разница между BeginInvoke и Invoke при вызове из потока пользовательского интерфейса.

0 голосов
/ 20 сентября 2009

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

0 голосов
/ 16 сентября 2009

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

Следовательно, чтобы обновить пользовательский интерфейс из другого потока (рабочий / пул потоков), вы должны переключиться на правильный поток. Control.BeginInvoke делает это за вас - асинхронно (в том смысле, что вы не блокируете до выполнения делегата). Invoke делает то же самое, за исключением того, что вы блокируете, пока делегат не будет выполнен.

1-й результат Google - активируется тема пользовательского интерфейса WinForms: подробный обзор Invoke / BeginInvoke / InvokeRequred

0 голосов
/ 16 сентября 2009

Я не уверен на 100%, что получил последнее предложение.

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

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

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