在后台加载数据期间,UWP ProgressRing显示有很大的滞后

时间:2019-03-15 09:37:32

标签: c# gridview uwp progress-bar

我将UWP GridViewDataTemplateSelector结合使用以显示不同星期的数据。当我更改星期时,我想在数据加载时显示加载器。我将MvvmLight用于ViewModels绑定,并且当我更改数据时,我要删除元素并将元素添加到GridView源中。问题是,当我在运行IsActive方法之前将UpdateGrid属性更改为true时,加载程序未激活,并且屏幕上存在滞后。如果数据加载(UpdateGrid方法)花费了超过一秒钟的时间,那么加载器是可见的,那么对我来说这意味着逻辑还可以,但是问题可能出在屏幕上并生成图形元素和性能?

我正在尝试使我的UpdateGrid方法异步和同步(内部没有api调用,因此可以同步)。该方法在ViewModel类中调用:

DispatcherHelper.CheckBeginInvokeOnUI(async () =>
     {
        SyncLoadingImageVisible = true;
        await UpdateGrid();
        SyncLoadingImageVisible = false;
     });

1 个答案:

答案 0 :(得分:1)

您可能会误解async/await的工作方式。当您将方法async标记为ans时,它不包含任何 real 等待(意味着没有I / O绑定操作或实际上在另一个线程上进行的操作),整个方法实际上将同步运行。在您的情况下也是如此,并且您提到UpdateGrid内部没有实际的异步工作,因此代码将像没有await一样工作。

从将SyncLoadingImageVisible设置为true到将其重新设置为false的那一刻,UI线程一直很忙-在此期间,UI线程为100 %致力于执行您的代码,因此用户不会看到任何UI更改。这会导致您看到的行为-滞后,因为在UpdateGrid方法执行完之前,UI线程没有机会更新UI。

要正确解决此问题,您将不得不使用等待的UpdateGridTask.Run方法中性能密集的非UI任务卸载到另一个线程,然后只有真正适用于应用程序UI的代码才应在UI线程上执行。这样,您将释放UI线程,以便在后台运行执行时向用户显示进度。