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

C# 在后台加载对话框时从数据库检索数据,c#,wpf,async-await,task,dapper,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

我在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));
因此,Dapper的
GetAllAsync
方法在通过从任务中检索
Result
强制执行查询之前,似乎不会实际执行查询


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

您当前只是将任务对象分配给所有磁带

试一试

\u allTapes=await\u conn.GetAllAsync().ConfigureAwait(false);

所以这是我确定的解决方案。。。在视图模型构造函数中:

_allTapes = Task.Run(() => _conn.GetAll<T_Program>());
事实证明,这只是问题的一部分。为了从组合框中获得良好的性能,我必须添加一个虚拟化堆栈面板:



而且组合中的项目甚至没有那么多(可能有一百个)。

您不应该使用
.Result
,而应该使用
等待
方法。@DavidG:Where?
\u allTapes.Result
块。除此之外,
Tapes
应该是一个适当的属性,其setter将引发
PropertyChanged
事件。无论数据是如何加载的,最后一步应该是设置该属性。这将导致UI刷新,因为我已经很久没有做任何WPF了,所以我不能完全确定。可能类似于您正在执行MVVM。@PanagiotisKanavos:PropertyChanged已被处理。请参阅。视图模型的构造函数不能设置为
async
。在这种情况下,在构造函数中使用AsyncLazy属性是的,我看到了。根据Stephen的说法,在第一次请求属性之前,这不会检索属性(强制查询),这可能会让我回到开始的地方。如果您希望尽早完成加载,那么要么在构造函数中执行“激发并忘记”任务-不建议这样做,因为任何异常都会丢失,或者使用从视图的onload(例如通过eventto命令)触发的异步方法。我通常使用后者,并填充一个ObservableCollection作为我的combo源-但是您必须注意线程问题。这不会更新U.I。但是比使用AsyncLazy属性更快-假设ComboBox的ItemSource绑定到LazyProperty.Result。延迟通常是处理数据库查询所花费的时间。项目的数量通常不会对渲染产生太大影响。通常是项目的复杂
DataTemplate
。它是否比一个
文本块
更复杂?仅供参考。@XAMlMAX数据模板是WPF组合框附带的标准库存模板。
Id = 6722, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"
_allTapes = await _conn.GetAllAsync<T_Program>().ConfigureAwait(false);
_allTapes = Task.Run(() => _conn.GetAll<T_Program>());
ItemsSource="{Binding Tapes, IsAsync=True}"