Как я могу сохранить свой WPF UI доступным во время выполнения операции? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть приложение WPF, которое читает листы Excel и отображает детали в сетке данных.

Модель основного представления имеет абстрактный метод проверки, который заполняет данные ValidateVM данными, помещает их в ObservableCollection и отображает их в сетке данных.

Как сохранить активный / применимый пользовательский интерфейс во время его работывыполняет операцию?Я понимаю, что мне нужно сделать это с диспетчером WPF с помощью потоков, но я не знаю, как и где.

Это метод проверки, который должен выполняться в новом потоке, чтобы он не мешалс видом?

1 Ответ

0 голосов
/ 18 февраля 2019

Если ваши данные загружаются в ответ на нажатие кнопки, проверьте тип возвращаемого значения вашего обработчика событий от void до Task и пометьте метод ключевым словом async.

Примерно так:

public async Task OnGetDataClick(object sender, RoutedEventArgs e)
{
    Data = await service.GetData();
}

Вам также потребуется изменить тип возврата метода, получающего данные.Скажите, что вы вернулись ObservableCollection<T>, измените на Task<ObservableCollection<T>>, а также добавьте ключевое слово async.В вашем обработчике событий вам нужно дождаться результата вызова службы, как показано выше.

Если вы читаете данные, используя API, который имеет асинхронные методы для чтения, тогда ваша служба может иметь методкак это:

public async Task<ObservableCollection<object>> GetDataAsync()
{
    return await api.GetDataAsync();
}

В противном случае, если вам нужно прочитать файл синхронно, вы можете сделать это в другом потоке, например:

public async Task<ObservableCollection<object>> GetDataAsync()
{
    return await Task.Run(() => api.getData());
}

Вот ссылка на документацию Microsoft по асинхронности/ await: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

Также у dotnetpearls есть несколько хороших примеров: https://www.dotnetperls.com/async

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