2020-11-26
zelder
2020-11-26
26/11
2020

Шпаргалки по WPF/XAML

На примере простой утилиты CopyDep (копирование файлов).

Новый поток на выполнение
private async void Button_Prepare(object sender, RoutedEventArgs e)
{
if (!_inited) return;
await Task.Factory.StartNew(
  () => _copyService.Prepare(this.Dispatcher, _status), // запуск долгого процесса в другом потоке
  TaskCreationOptions.LongRunning);
}


Использование потока GUI
public void Prepare(Dispatcher DGUI, Status status)
{
DGUI.BeginInvoke(() =>
{
// обновление основного потока с GUI (status - это объект, который связан с выводом (MVVM))
status.IsError = false;
status.Message = "Подготовка..";
}, DispatcherPriority.Normal);
// .. долгая долгая операция, в которй никто не мешает выводить в потоке GUI ход выполнения..
}

Замечания
Внимательнее следить в каком потоке происходит обновлние объектов, которые связаны с выводом (возможно через MVVM).
Следить за большим количеством информации на вывод. Так, например TreeView может занять основной поток (выводить тысячи наименований в себе), и покажется, что мы заняли основной поток долгой задачей.

.