Получение данных из базы данных в фоновом режиме во время загрузки диалога - PullRequest
0 голосов
/ 08 ноября 2018

Я использую Dapper в приложении WPF для извлечения данных из базы данных для пары списков со списком. Я хотел бы, чтобы этот поиск происходил в фоновом режиме; это предотвратит небольшую задержку, когда пользователь откроет первое поле со списком.

Итак, я сделал это:

private Task<IEnumerable<T_Program>> _allTapes;

// Binds to combobox ItemsSource
public IEnumerable<T_Program> Tapes => 
   _allTapes.Result.Where(x => x.Program.Equals(Program));

А в конструкторе моего View Model:

_allTapes = _conn.GetAllAsync<T_Program>();

Но я не получил «улучшение производительности», которое хотел.

При наведении курсора на _allTapes во время отладки выдается следующее описание:

Id = 6722, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"

Таким образом, может показаться, что метод GetAllAsync Даппера на самом деле не выполняет запрос, пока он не будет вызван извлечением Result из Задачи.

Как получить желаемое фоновое выполнение?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Итак, это решение, на котором я остановился ... В конструкторе View Model:

_allTapes = Task.Run(() => _conn.GetAll<T_Program>());

IsAsync = True необходимо добавить в поле со списком ItemsSource привязка, чтобы предотвратить блокировку загрузки формы.

ItemsSource="{Binding Tapes, IsAsync=True}"

Оказывается, это была только часть проблемы. Чтобы получить хорошую производительность из поля со списком, мне нужно было добавить к нему панель стека виртуализации:

<ComboBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel />
    </ItemsPanelTemplate>
</ComboBox.ItemsPanel>

И в комбо даже не так много предметов (возможно, сотня).

0 голосов
/ 08 ноября 2018

В настоящее время вы просто назначаете объект Task _allTapes.

Попробуйте

_allTapes = await _conn.GetAllAsync<T_Program>().ConfigureAwait(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...