对话框加载时在后台从数据库中检索数据

时间:2018-11-08 16:00:00

标签: c# wpf async-await task dapper

我正在WPF应用程序中使用Dapper从数据库中检索几个组合框列表的数据。我希望这种检索在后台进行;当用户打开第一个组合框时,它将防止一小段延迟。

所以我做到了:

private Task<IEnumerable<T_Program>> _allTapes;

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

在我的视图模型的构造函数中:

_allTapes = _conn.GetAllAsync<T_Program>();

但是我没有得到想要的“性能改进”。

在调试过程中将光标悬停在_allTapes上会产生以下描述:

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

因此,似乎Dapper的GetAllAsync方法实际上不会执行查询,直到通过从Task中检索Result来强制查询为止。

如何获得所需的后台执行?

2 个答案:

答案 0 :(得分:1)

您当前正在将Task对象分配给_allTapes。

尝试

_allTapes = await _conn.GetAllAsync<T_Program>().ConfigureAwait(false);

答案 1 :(得分:0)

这是我已经解决的解决方案...在View Model构造函数中:

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

IsAsync = True 必须添加到组合框ItemsSource绑定中,以防止表单加载被阻塞。

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

事实证明,这只是问题的一部分。为了从组合框中获得良好的性能,我必须向其添加虚拟化堆栈面板:

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

该组合中甚至没有多少东西(也许一百个)。