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

PRE*_*PRE 1 .net c# task-parallel-library async-await

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

如下所示:

async Task GetData()
{

    var dataCollection = await GetSomeData();
    await DoThis();
    await DoThat();
}
Run Code Online (Sandbox Code Playgroud)

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

如下所示:

async Task GetData()
{
    var dataCollection = await GetSomeData();
    await Task.Delay(100);
    await DoThis();
    await DoThat();
}
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

  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;
        }
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

任务DoThat()也遵循与DoThis相同的流程.数据处理也包含在async-await Tasks中,它们只是在处理某些类属性.

希望我很清楚..再次感谢所有人

Yuv*_*kov 6

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

如果没有发生这种影响,那么这意味着你的方法实际上并不是异步的,并且它们更有可能以同步的方式运行代价高昂的操作,阻塞你的UI线程.

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

  • 不,如果它实际上正在返回任务,那么它是适当的异步.如果你在`GetSomeData`中使用`Task.Result`那么*那将是一个问题.当我们看不到除"GetData"以外的任何方法时,很难给出详细信息:( (4认同)