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