await task.delay帮助UI刷新更快,但是如何呢?

本文关键字:何呢 delay task 帮助 UI 刷新 await | 更新日期: 2023-09-27 18:16:19

我有一个视图模型,它正在获取一行记录并显示在Windows phone UI上。这个获取数据的视图模型方法正在做很多任务,所有的任务都标有Await操作。

如下图:

async Task GetData()
{
    var dataCollection = await GetSomeData();
    await DoThis();
    await DoThat();
}

UI在'DoThis'调用被调用后刷新。现在我观察到,如果我引入一个任务。在其他任务完成之前延迟代码,UI立即刷新。这是我最初的目标,在'GetSomeData'返回后立即刷新UI然后触发其他任务。

如下图:

async Task GetData()
{
    var dataCollection = await GetSomeData();
    await Task.Delay(100);
    await DoThis();
    await DoThat();
}

所以我从中理解的是,UI线程在调用Task后有机会刷新。拖延已成定局。然而,没有任务。延迟,如果DoThis被调用,在它找到DoThis中的第一个可等待功能之前会损失一些时间所以它可以返回并继续UI Refresh。

我的问题是:

    我理解对了吗?
  1. 把这个放在生产代码中安全吗?
提前感谢,希望我已经解释清楚了…公关

下面是这些方法的细节,因为没有这些方法,就不清楚程序中发生了什么。(

async Task<ObservableCollection<MyModel>> GetSomeData()
{
    return await Task.Run(() =>
    {
        using (var db = new MainModelDataContext())
        {
            List<MyModel> temp =
                db.Models.Where(Some condition)
                  .Take(30)
                  .ToList();
            var returnCollection = new ObservableCollection<MyModel>(temp);
            return returnCollection;
        }
}

ObservableCollection被绑定到UI Page上的一个列表控件。这个方法正在被页面视图模型调用。

async Task DoThis()
{
   // do some data processing and then post that to the Server 
   // this is the first awaitable method after the data processing
   await (an HttpClientHandler).PostAsync();
}

任务DoThat()也遵循与DoThis相同的流程。数据处理也封装在async-await任务中,它们只是处理一些类属性。

希望我清楚…再次感谢大家

await task.delay帮助UI刷新更快,但是如何呢?

当您调用Task.Delay时,您在这100毫秒内将控制权返回给UI消息循环,并且UI消息循环有机会处理来自其队列的更多消息。这就是为什么你会感受到"提神"的效果。如果你的GetSomeData方法是真正异步的,你的UI应该在它的操作过程中保持响应,当它完成后,它将继续执行下一个await

如果这种效果没有发生,那么这意味着你的方法并不是真正的异步,更有可能的是它们以同步的方式运行一个昂贵的操作,阻塞了你的UI线程。

在将其投入生产之前,您必须研究为什么需要Task.Delay来刷新您的UI。