繁体   English   中英

等待task.delay有助于更快地刷新UI,但是如何?

[英]await task.delay helps in UI refresh faster, but how?

我有一个视图模型,该视图模型正在提取一行记录并在Windows Phone UI上显示。.这种提取数据的视图模型方法正在执行许多任务,所有任务都标记有Await操作。

如下图所示:

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();
}

因此,据我了解,在调用Task.Delay之后,UI线程就有机会刷新。 但是,如果没有Task.Delay,则如果调用DoThis,则会浪费一些时间,直到它在“ DoThis”中找到第一个可等待的方法,以便它可以返回并继续执行UI Refresh。

我的问题是:

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

在此先感谢您,希望我能解释清楚。

下面是这些方法的详细信息,因为没有这些方法,不清楚程序中正在执行什么操作。

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();
}

Task DoThat()也遵循与DoThis相同的流程。数据处理也包装在async-await Tasks中,它们仅在某些类属性上起作用。

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

当您调用Task.Delay ,您将控制权返回到UI消息循环持续了100毫秒,并且UI消息循环有机会处理其队列中的更多消息。 这就是为什么您遇到“刷新”效果的原因。 如果您的GetSomeData方法是真正的异步方法,则您的UI应在其操作期间保持响应状态,并在完成后将继续执行下一个await

如果这种影响没有发生,则意味着您的方法并不是真正的异步方法,并且更有可能它们以同步方式运行昂贵的操作,从而阻塞了您的UI线程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM