我正在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
来强制查询为止。
如何获得所需的后台执行?
答案 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>
该组合中甚至没有多少东西(也许一百个)。