Является ли BeginInvoke / EndInvoke хорошей практикой для вызова в основном потоке? - PullRequest
4 голосов
/ 21 октября 2010

Это хорошая практика для вызова делегата для потока MainForm - таким образом?:

Txt.MainForm.EndInvoke(
Txt.MainForm.BeginInvoke(
    new MethodInvoker(delegate() 
       { // code here }
)));

Ответы [ 3 ]

8 голосов
/ 21 октября 2010

Нет - потому что, если вы звоните EndInvoke, он будет блокирован до завершения делегата. Если вам нужно такое поведение, просто используйте Invoke.

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

2 голосов
/ 21 октября 2010

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

0 голосов
/ 21 октября 2010

Не принимая во внимание то, что упоминали другие (я считаю, что эта цепочка EndInvoke - BeginInvoke является просто примером использования делегата): Использование делегатов на 100% нормально. Если это единственное использование тела делегата, нет необходимости определять его как именованный метод. В коде он чище и не нужно перепрыгивать через файл. Рассмотрите возможность использования более нового синтаксиса для делегатов:

new MethodInvoker(() => { // code here })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...