wait task.delay 有助于加快 UI 刷新速度,但是如何实现呢?

2024-05-10

我有一个视图模型,它正在获取一行记录并显示在 Windows Phone UI 上。这个获取数据的视图模型方法正在执行大量任务,所有任务都标记为等待操作。

如下所示:

async Task GetData()
{

    var dataCollection = await GetSomeData();
    await DoThis();
    await DoThat();
}

调用“DoThis”后,UI 将刷新。 现在我只是观察到,如果我在其他任务完成之前在代码中引入 Task.Delay,则 UI 会立即刷新。这是我最初的目标,在“GetSomeData”返回后立即刷新 UI,然后触发其他任务。

如下所示:

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

所以我从中了解到的是,UI 线程在调用 Task.Delay 后有机会刷新。但是,如果没有 Task.Delay,如果调用 DoThis,则在找到“DoThis”中的第一个可等待方法之前会损失一些时间,以便它可以返回并继续 UI 刷新。

我的问题是:

  1. 我理解正确吗?
  2. 将其放入生产代码中安全吗?

预先感谢并希望我已经解释清楚了..

Pr

下面是这些方法的详细信息,如果没有这些方法,就不清楚程序中发生了什么。:(

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 页面上的列表控件。该方法由页面视图模型调用。

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 相同的流程。数据处理也包含在异步等待任务中,它们只是处理一些类属性。

希望我说清楚了..再次感谢大家


你打电话时Task.Delay,您将这 100 毫秒的控制权返回给 UI 消息循环,并且 UI 消息循环有机会处理其队列中的更多消息。这就是为什么您会体验到“清爽”效果。如果你的GetSomeData方法是真正的异步,您的 UI 在其操作期间应该保持响应,并且当它完成时,它将继续执行下一个await.

如果这种效果没有发生,那就意味着你的方法并不是真正的异步,而且他们更有可能在一个成本高昂的地方进行运营同步时尚正在阻塞你的 UI 线程。

在将其投入生产之前,您必须了解为什么需要Task.Delay刷新您的用户界面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wait task.delay 有助于加快 UI 刷新速度,但是如何实现呢? 的相关文章

随机推荐