UWP 进度环在后台数据加载期间显示有很大的延迟



我正在使用带有DataTemplateSelector的 UWPGridView来显示不同周的数据。当我更改周时,我想在加载数据时显示加载器。我正在使用 MvvmLight 进行视图模型绑定,当我更改数据时,我会删除元素并将其添加到GridView源。问题是,当我在运行该方法之前IsActive属性更改为 true 时UpdateGrid加载程序未处于活动状态,并且屏幕上存在滞后。如果数据加载(UpdateGrid方法)需要超过一秒,则加载器是可见的,所以对我来说这意味着那里的逻辑是可以的,但问题可能在于在屏幕上生成图形元素和性能?

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

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

你可能误解了async/await的工作方式。当您将一个方法标记为async它不包含真正的await 时(意味着没有 I/O 绑定操作或实际发生在另一个线程上的操作),整个方法基本上将同步运行。在您的情况下也是如此,以及您提到的UpdateGrid内部没有实际的异步工作,因此代码将像真的没有await一样工作。

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

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

最新更新