Страницы

Поиск по вопросам

среда, 12 июня 2019 г.

Асинхронное свойство

В программе есть постраничный вывод данных из БД в DataGrid.
Данные подгружаются асинхронно порциями при смене номера текущей страницы.
Сейчас сделано так, что в сеттере CurrentPage вызывается LoadProducts, но т.к. нельзя написать await, то метод выполняется синхронно.
Какой такое должно реализовываться?
public int CurrentPage { get { return _currentPage; } set { _currentPage = value; LoadProducts(); OnPropertyChanged(); } }
async void LoadProducts() { // Получение данных из БД }


Ответ

Никак.
Свойство является по существу полем с небольшой довеской. При использовании поля никто не предполагает, что оно будет медленным, асинхронным, или хуже того сможет зависнуть или бросить исключение (если только не присваивать неправильное значение).
Используйте обыкновенную async-функцию:
public int CurrentPage { get { return _currentPage; } }
public async Task SwitchToPage(int value) { // Получение данных из БД _currentPage = value; OnPropertyChanged(nameof(CurrentPage)); }

Если речь идёт об интерфейсе, тогда, возможно, имеет смысл такое изменение:
public int CurrentPage { get { return _currentPage; } set { if (_currentPage == value) return; _currentPage = value; SwitchToPage(value); // игнорируем возвращаемое значение OnPropertyChanged(); // загрузка произойдёт в фоне } }
async Task SwitchToPage(int value) { try { IsCurrentPageEditable = false; // Получение данных из БД } catch (тут исключения) { // тут обработка } finally { IsCurrentPageEditable = true; } }
bool _isCurrentPageEditable = true; public bool IsCurrentPageEditable { get { return _isCurrentPageEditable; } private set { _isCurrentPageEditable = value; OnPropertyChanged(); } }
и в UI

Комментариев нет:

Отправить комментарий