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

241
01 июля 2017, 08:35

В программе есть постраничный вывод данных из БД в DataGrid.

Данные подгружаются асинхронно порциями при смене номера текущей страницы.

Сейчас сделано так, что в сеттере CurrentPage вызывается LoadProducts, но т.к. нельзя написать await, то метод выполняется синхронно.

Какой такое должно реализовываться?

public int CurrentPage
{
    get { return _currentPage; }
    set
    {
        _currentPage = value;
        LoadProducts();
        OnPropertyChanged();
    }
}
async void LoadProducts()
{
  // Получение данных из БД
}
Answer 1

Никак.

Свойство является по существу полем с небольшой довеской. При использовании поля никто не предполагает, что оно будет медленным, асинхронным, или хуже того сможет зависнуть или бросить исключение (если только не присваивать неправильное значение).

Используйте обыкновенную 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

<TextBox Text="{Binding CurrentPage}" IsEnabled="{Binding IsCurrentPageEditable}"/>
<TextBlock Text="загрузка..." Visibility="{Binding IsCurrentPageEditable,
        Converter={StaticResource BooleanToVisibilityConverter}}"/>
READ ALSO
Почему метод Show у Editor Window работает некорректно?

Почему метод Show у Editor Window работает некорректно?

В документации сказано, что метод EditorWindowShow открывает окно EditorWindow

241
Найти коэффициент полинома C#

Найти коэффициент полинома C#

Я пишу программу, способную решать уравнения / системы с помощью этой библиотеки

351
EF множественные CRUD

EF множественные CRUD

Есть несколько моделей и для них BusinessContext в котором описаны CRUD операцииПо сути они одни, только меняются таблицы

251
Рисование карты игроком по типу Free Rider HD

Рисование карты игроком по типу Free Rider HD

Надо предоставить игроку возможность создавать игровое поле посредством рисования(пример)Ввод осуществляется исходя из координат курсора(в...

200