我有一个WPF MVVM c#应用程序.在我的一个视图中,我必须在单击按钮后从数据库中检索数据.对数据库的调用非常长,所以我想在调用时启用微调器,并在调用完成后禁用它.
所以在处理按钮单击的方法中(使用Command,而不是后面的代码)我设置boolean变量以启用微调器,然后创建一个Task取数据并将其设置为 ObservableCollection<T>这样的
private void GetDataButtonCommand() {
this.IsBusy = true;
var tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(() =>
{
System.Windows.Application.Current.Dispatcher.BeginInvoke(new System.Action(() =>
{
var GotData= DBHelper.GetData();
_observablecollectionname.Clear();
foreach (var item in GotData)
{
_observablecollectionname.Add(item);
}
}));
}));
var finalTask = Task.Factory.ContinueWhenAll(tasks.ToArray(), datacomplete =>
{
this.IsBusy = false;
});
}
Run Code Online (Sandbox Code Playgroud)
完成后Task我想禁用微调器.
我遇到的问题是我在通话期间无法看到微调器.即使您使用a Task来执行数据库查询,UI仍然被阻止.
我究竟做错了什么?
您的代码在UI上运行.
您可以完成所有操作,System.Windows.Application.Current.Dispatcher.BeginInvoke(new System.Action(() => { ... }))因此阻止UI是很自然的.
您应该只在真正需要执行UI操作时调用调度程序.
var GotData= DBHelper.GetData();在调度员之前移动.
但是最好使用C#5.0及更高版本的async/ awaitpattern/keywords.
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |