Вопрос о WPF Dispatcher.BeginInvoke вызывается из той же ветки!Зачем? - PullRequest
2 голосов
/ 17 сентября 2010

Я относительно новичок в WPF.Я проверяю некоторый код, который выглядит следующим образом:

private void button_Click(object sender, RoutedEventArgs e)
{
    //Queue on dispatcher in the background so it doesn't make the UI slow
        Dispatcher.BeginInvoke(new dMyDelegate(PerformOperation), DispatcherPriority.Background);
}

Из комментария я предполагаю, что оригинальный код чувствовал, что это было необходимо, чтобы сделать пользовательский интерфейс более отзывчивым, однако я понимаю, что Dispatcher.BeginInvoke просто запускает что-то в потоке пользовательского интерфейса.Так как buttn_Click уже находится в потоке пользовательского интерфейса, какой смысл?Возможно, я неправильно понимаю Dispatcher и BeginInvoke.Я предполагаю, что Dispatcher в данном случае является диспетчером, принадлежащим классу, в котором находится этот метод, а именно MainWindow.xaml.Может кто-то просветить меня?

Спасибо

1 Ответ

5 голосов
/ 17 сентября 2010

Ну, он запрашивает «фоновый» приоритет, поэтому он будет выполняться только тогда, когда будут обработаны более важные события ... Если это является частью обновления большого экрана, он будет эффективно ждать, пока все это не будет выполнено. произошло до выполнения. Тем не менее, если он собирается делать что-то длительное (или делать какие-либо потенциально блокирующие вызовы), то вы правы, на самом деле он вообще не должен работать в потоке пользовательского интерфейса.

...