我将UWP GridView
与DataTemplateSelector
结合使用以显示不同星期的数据。当我更改星期时,我想在数据加载时显示加载器。我将MvvmLight用于ViewModels绑定,并且当我更改数据时,我要删除元素并将元素添加到GridView
源中。问题是,当我在运行IsActive
方法之前将UpdateGrid
属性更改为true时,加载程序未激活,并且屏幕上存在滞后。如果数据加载(UpdateGrid
方法)花费了超过一秒钟的时间,那么加载器是可见的,那么对我来说这意味着逻辑还可以,但是问题可能出在屏幕上并生成图形元素和性能?>
我正在尝试使我的UpdateGrid
方法异步和同步(内部没有api调用,因此可以同步)。该方法在ViewModel类中调用:
DispatcherHelper.CheckBeginInvokeOnUI(async () =>
{
SyncLoadingImageVisible = true;
await UpdateGrid();
SyncLoadingImageVisible = false;
});
答案 0 :(得分:1)
您可能会误解async/await
的工作方式。当您将方法async
标记为ans时,它不包含任何 real 等待(意味着没有I / O绑定操作或实际上在另一个线程上进行的操作),整个方法实际上将同步运行。在您的情况下也是如此,并且您提到UpdateGrid
内部没有实际的异步工作,因此代码将像没有await
一样工作。
从将SyncLoadingImageVisible
设置为true
到将其重新设置为false
的那一刻,UI线程一直很忙-在此期间,UI线程为100 %致力于执行您的代码,因此用户不会看到任何UI更改。这会导致您看到的行为-滞后,因为在UpdateGrid
方法执行完之前,UI线程没有机会更新UI。
要正确解决此问题,您将不得不使用等待的UpdateGrid
将Task.Run
方法中性能密集的非UI任务卸载到另一个线程,然后只有真正适用于应用程序UI的代码才应在UI线程上执行。这样,您将释放UI线程,以便在后台运行执行时向用户显示进度。