使用任务但UI仍然被阻止

0 c# wpf multithreading mvvm

我有一个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仍然被阻止.

我究竟做错了什么?

Tse*_*eng 5

您的代码在UI上运行.

您可以完成所有操作,System.Windows.Application.Current.Dispatcher.BeginInvoke(new System.Action(() => { ... }))因此阻止UI是很自然的.

您应该只在真正需要执行UI操作时调用调度程序.

var GotData= DBHelper.GetData();在调度员之前移动.

但是最好使用C#5.0及更高版本的async/ awaitpattern/keywords.