我有一个 View 模型正在获取一行记录并显示在 Windows Phone 用户界面上。这个获取数据的 View 模型方法正在执行大量任务,所有任务都标记为等待操作。
如下所示:
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 刷新。
我的问题是:
- 我的理解正确吗?
- 将其放入生产代码中是否安全?
提前致谢,希望我已经解释清楚了..
公关
下面是这些方法的详细信息,因为如果没有这些方法,则不清楚程序中发生了什么。:(
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 绑定(bind)到 UI 页面上的列表控件。页面 View 模型正在调用此方法。
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
时,您会在这 100 毫秒内将控制权返回给 UI 消息循环,并且 UI 消息循环有机会处理其队列中的更多消息。这就是您体验“提神”效果的原因。如果您的 GetSomeData
方法是真正异步的,您的 UI 应该在其操作期间保持响应,并且当它完成时,它将继续执行下一个 await
。
如果这种效果没有发生,则意味着您的方法不是真正的异步,更有可能是它们在同步中运行一个代价高昂的操作阻塞您的 UI 线程的时尚。
在将其投入生产之前,您必须研究为什么需要 Task.Delay
来刷新您的 UI。
关于c# - await task.delay 有助于更快地刷新 UI,但是如何呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25115446/