前言

在我们应用程序中,如果有较大的数据需要从数据库或者本地读取,且是一次性的话,可以提前获取数据并缓存在内存中。

一般处理方法:利用应用程序启动到用户使用功能这一段时间,提前加载数据。

问题来了,因数据大小的不固定性,提前加载的速度有快有慢,如果保证不会重复读取数据库、只返回一次结果呢?

Task ConfigureAwait

使用ConfigureAwait可以解决以上问题。详情如下:

程序启动后,在相应的事件中,调用初始化方法

     private Task<List<EnglishWordInfo>> _wordsCacheDelayTask;
/// <summary>
/// 提前初始化字典
/// 注:通过InitWordInfos提前缓存数据,提升用户体验
/// </summary>
public void InitWordInfos()
{
if (_wordsCacheDelayTask == null)
{
_wordsCacheDelayTask = GetWordsTask();
}
}

使用ConfigureAwait异步获取数据

通过ConfigureAwait的使用,不等待结果的返回。

     /// <summary>
/// 延时获取数据
/// 注:延时获取,避免界面卡顿
/// </summary>
/// <returns></returns>
private async Task<List<EnglishWordInfo>> GetWordsTask()
{
return await Task.Run(() =>
{
return EnglishDictService.Instance.GetWords();
}).ConfigureAwait(false);
}

添加封装数据延迟任务

如果不是程序启动后立即加载缓存,而是程序使用期间对数据缓存的处理。可以添加如下对缓存延迟任务的封装,保证只获取一次缓存数据。

     /// <summary>
/// 获取数据延迟任务
/// 注:如果没有提前延迟任务,则重新获取数据
/// </summary>
public Task<List<EnglishWordInfo>> WordsCacheDelayTask
{
set => _wordsCacheDelayTask = value;
get
{
if (_wordsCacheDelayTask == null)
{
_wordsCacheDelayTask = GetWordsTask();
} return _wordsCacheDelayTask;
}
}

获取缓存数据

通过Task.Result,获取缓存任务的结果,此缓存任务的状态可以是:

  • 执行中 -- 则会在原有进度下,继续执行并返回结果
  • 已完成 -- 则会返回原有的结果

无论获取多少次,Result只会返回同样的结果,可以把WordsCacheDelayTask.Result看成是一个静态的缓存。

     /// <summary>
/// 获取缓存数据
/// </summary>
private List<EnglishWordInfo> WordInfosCache => WordsCacheDelayTask.Result;

参考列表:

在编写异步方法时,使用 ConfigureAwait(false) 避免使用者死锁

将 async/await 异步代码转换为安全的不会死锁的同步代码(使用 PushFrame)

C# 提前异步加载数据的更多相关文章

  1. android 网络异步加载数据进度条

    ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...

  2. winform异步加载数据到界面

    做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...

  3. 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]

    /**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...

  4. 淘宝购物车页面 智能搜索框Ajax异步加载数据

    如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...

  5. Jquery zTree结合Asp.net实现异步加载数据

    zTree结合Asp.net实现异步加载数据 实现简单操作 zTree 下载 api 访问 :http://www.ztree.me/v3/main.php 例子中用到json数据转化 newtons ...

  6. jquery easyui easyui-treegrid 使用异步加载数据

    jquery easyui easyui-treegrid 使用异步加载数据 jquery easyui easyui-treegrid 异步请求 >>>>>>&g ...

  7. Highcharts 异步加载数据曲线图表

    导入 data.js 文件 异步加载数据需要引入以下js 文件: <script src="http://code.highcharts.com/modules/data.js&quo ...

  8. [Ext.Net]TreePanel 异步加载数据

    异步加载数据指的是页面加载的时候只显示根目录,点击根目录再去加载其子目录. 下面就来介绍下这种异步加载的树结构要怎么实现 现将例子的图 QQ图片20131225134353.jpg (12.1 KB, ...

  9. 新手教程:不写JS,在MIP页中实现异步加载数据

    从需求谈起:在 MIP 页中异步加载数据 MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统.所有 JS 交互都需要使用 MIP 组件实现 ...

随机推荐

  1. SPPNET

    SPPNet Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 文章地址:https://ar ...

  2. Resnet论文翻译

    摘要 越深层次的神经网络越难以训练.我们提供了一个残差学习框架,以减轻对网络的训练,这些网络的深度比以前的要大得多.我们明确地将这些层重新规划为通过参考输入层x,学习残差函数,来代替没有参考的学习函数 ...

  3. 亲测可用,iptables实现NAT转发。

    环境 服务器A:192.168.1.7 服务器B: 192.168.1.160 需求 实现将本机(192.168.1.7:7410)端口流量转发给(192.168.1.160:9200). 1. 内核 ...

  4. .NETCore+EF+MySql+Autofac简单三层架构

    前言 其实就是一个简单依赖注入的三层架构.记录一下,大佬们就不用看下去了.重点在最后面,可以直接拖到底去看. 正文 1.贴代码 1.整体的一个结构.大佬们应该一眼就看明白了. 2.MySqlConte ...

  5. Mysql常用基础操作(备忘录)

    常常忘记mysql的一些命令行操作,甚至于说,比较复杂的sql格式记不住或忘记了,也可能根本不会考虑去记,因此,做一下汇总,当下次出现恍惚时不至于去百度挨个找,有时就是记不起来,但是只要给点药引子,立 ...

  6. Android Gradle 依赖配置:implementation & api

    背景: Android Gradle plugin 3.0开始(对应Gradle版本 4.1及以上),原有的依赖配置类型compile已经被废弃,开始使用implementation.api和anno ...

  7. Linux记录~持续更新~

    ls -ildha /etc -i 显示对应id号 唯一标识 -l 显示详情 -d 显示当前文件夹 不包括子目录 -h 单位为KB 而不是B -a 显示所有 包括隐藏文件 mkdir mkdir -p ...

  8. Redis入门教程(二)

    推荐阅读: Redis入门教程(一)https://www.cnblogs.com/jichi/p/10285346.html 5. Redis 的数据结构 5.1 Redis 数据结构介绍 redi ...

  9. Error:"MetaStoreClient lost connection. Attempting to reconnect (1 of 24) after 5s. getCurrentNotificationEventId" occurs as HiveServer2 fails to start as it cannot connect to Metastore in HDP 3.0

    SupportKB Problem Description:After upgrading to HDP 3.0, the HiveServer2 fails to start and the fol ...

  10. centos7下报错: import requests ImportError: No module named requests

    在网上扒了一个python脚本,在centos7上执行的时候报错: import requestsImportError: No module named requests 原因是:requests是 ...