Dispatcher.Invoke () не работает для приложения - PullRequest
3 голосов
/ 29 сентября 2011

Я работаю над проектом моей компании, в котором они использовали Dispatcher.Invoke() во многих местах. Если я использую BeginInvoke вместо Invoke, то Synchronisation между потоками работает нормально, но в случае Invoke приложение работает замораживание и даже не ввод выполнения в методе делегата также. Кто-нибудь знает, почему это происходит так?

Любой ответ будет оценен.

Пример кода для Invoke, используемого в проекте:

Dispatcher.Invoke(DispatcherPriority.Send,
                  new DelegateMethod(MethodtoExecute));

private delegate void DelegateMethod();

 void MethodtoExecute()
        {
            try
            {

            }
            catch (Exception /*ex*/)
            {

            }
            finally
            {

            }
        }

1 Ответ

3 голосов
/ 29 сентября 2011

Dispatcher.Invoke выполняется синхронно в том же потоке, что и ваше приложение, поэтому все, что вы вызываете, может блокировать основной поток приложения. Dispatcher.BeginInvoke выполняется асинхронно, поэтому при выполнении не связывает основной поток приложения.

Поскольку вы используете DispatcherPriority.Send, который является наивысшим уровнем приоритета диспетчера, все, что вы вызываете, запускается раньше всего, включая отображение экрана или прослушивание событий. Я бы рекомендовал переключить его на DispatcherPriority.Background, который работает с более низким приоритетом, чем Render и Input. См. на этой странице для получения списка DispatcherPriority уровней и порядка их выполнения

Очень рекомендую посмотреть ответ на вопрос здесь

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