[英]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。
我的问题是:
在此先感谢您,希望我能解释清楚。
镨
下面是这些方法的详细信息,因为没有这些方法,不清楚程序中正在执行什么操作。
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.