WPF MVVM模式下的无阻塞刷新

MVVM模式下的无阻塞刷新的两种方法:

//传统模式下的无刷新调用(主线程开新线程,新线程又调用主线程来更新UI)

//第1步先在线程内部计算出需要绑定的数据

//第2步然后再使用Invoke/BeginInvoke填充Model

private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            return;
            Thread thread = new Thread(new ThreadStart(delegate
            {
                //第1步 耗时的计算或请求等操作的代码写在这里
                Thread.Sleep(10000);
                this.Dispatcher.Invoke(new Action(() =>
                {
                    //又进入主线程
                    //第2步 这里更新控件 或填充填充Model,来改变UI
                    //this.Dispatcher.Invoke()中的this指的是当前的窗体类 。在Visual studio中将鼠标至于this上即可明白
                    //这段代码是主线程来执行所以如果有耗时的运算则会导致UI卡顿。
                }));
            }));
            thread.IsBackground = true;
            thread.Start();
        }

//方法二:由于方法一在代码中嵌入线程函数,代码是很分散的,同时也消耗大量资源,

//为了让我们代码尽可能的做到内外同步执行。我们使用async、await、Task

        private async Task AsyncAccess()
        {
            var getDataListTask = new Task(() =>
            {
                //耗时的计算或请求等操作的代码写在这里
                Thread.Sleep(5000);
            });
            getDataListTask.Start();
            await getDataListTask;
            var fillModelTask = Task.Factory.StartNew(() =>
            {
                //这里更新控件 或填充填充Model,来改变UI
            }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
            await fillModelTask;
        }

 

posted @ 2017-10-27 15:45  马凌云  阅读(717)  评论(0编辑  收藏  举报