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