1 - Да.Каждое окно в вашем приложении имеет один основной поток для своего пользовательского интерфейса, и только в этом потоке вы можете управлять элементами пользовательского интерфейса.Доступ к нему можно получить через диспетчер для этого окна, которое отправляет сообщения из любого потока, который также является потоком пользовательского интерфейса окна.
ThreadPool.RunAsync создает рабочий элемент для запуска в каком-либо произвольном потоке ThreadPool, который, вероятно, обычно никогда не выполняетсябыть вашим потоком пользовательского интерфейса.
Поскольку вы обращаетесь к объекту пользовательского интерфейса для некоторых его свойств пользовательского интерфейса, вам нужно быть в потоке пользовательского интерфейса, чтобы сделать это.
2 - Для метода 2 вашвы бессмысленно высовываетесь в поток пула потоков, просто чтобы сказать ему, что нужно вернуться к потоку пользовательского интерфейса, чтобы выполнить свою работу.В этом нет необходимости, поскольку никакая работа не будет выполнена в этом потоке, поскольку Dispatcher все равно отправляет все из потока пользовательского интерфейса.3 избегайте этого - хотя, если автосохранение уже вызывается из потока пользовательского интерфейса, нет необходимости в вызове Dispatcher.
Вы фактически используете тот же Dispatcher для 2 и 3, если находитесь в одном окнеприложение, просто разные способы доступа к нему.То, как вы получаете доступ через 2, - это то, что вы делали бы, если бы вашего кода не было в выделенном коде объекта DependencyObject.
См. https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.dependencyobject#remarks для заметок о Dispatcher