【发布时间】:2016-02-04 20:39:09
【问题描述】:
我有一个 WPF MVVM c# 应用程序。在我的一个观点中,我必须在单击按钮后从数据库中检索数据。 对数据库的调用真的很长,所以我想在调用时启用微调器,并在调用完成时禁用它。
所以在处理按钮单击的方法中(使用命令,而不是后面的代码)我设置布尔变量以启用微调器,然后创建一个 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;
});
}
Task 完成后,我想禁用微调器。
我遇到的问题是在通话期间我看不到微调器。 UI 仍然被阻止,即使你使用Task 来执行数据库查询。
我做错了什么?
【问题讨论】:
-
绘制en.wikipedia.org/wiki/Swim_lane。拿纸清单绘制 2 个车道“UI 线程”,“其他线程”。比将您的代码的每一行映射到其中一个通道......如果这还不足以找到问题,它至少应该向您澄清您不知道的内容。
-
任务是否在后台线程中执行?此代码中没有 async/await。对我来说,它看起来像是在 UI 线程上运行的。或者至少没有从后台线程返回的意义。
-
ContinueWith和ContinueWhenAll等价于 C# 5.0 中的await调用 -
@Tseng 又学到了一些东西 ;)
标签: c# wpf multithreading mvvm