c# - await task.delay 有助于更快地刷新 UI,但是如何呢?

标签 c# .net task-parallel-library async-await

我有一个 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 刷新。

我的问题是:

  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 绑定(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/

相关文章:

c# - TPL 数据流 block 中抛出的 OperationCanceledException 被吞没

c# - 值总是一样的

.net - 多核环境中的多线程应用程序 - 每个核心的奇怪负载

c# - 未调用 Windows 窗体文本框函数

c# - 具有多个系列的 MS 图表上的工具提示标签错误

c# - Console.Beep可以替代Win8 x64吗?

c# - TFS 2010-从 checkin 任务中获取文件的特定版本

c# - Specflow 无法与 VS 2012 一起正常工作

c# - 同一控件中的 WPF 失去焦点问题

c# - Visual Studio 2012 Express 调试 explorer.exe - 没有命中断点