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;}