前言

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

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

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

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. iscc2018(一只猫的心思)

    由于这一个杂项类没有更新,所以今天特地来写一下博文.希望能够帮助到你们!!!! 其他关于杂项类的解析,可以查看(https://blog.csdn.net/qq_41187256/article/de ...

  2. Django 基础二(View和urls)

    上一篇博文已经成功安装了python环境和Django,并且新建了一个空的项目.接下来就可以正式开始进行Django下 的Web开发了.首先进入项目的主目录: cd ./DjangoLearn/hol ...

  3. Visual Studio Code 中文界面设置

    Visual Studio Code 中文界面设置 昨天,想要试一下用 VS Code 写 Markdown 格式的博客,下载下来发现是英文界面: 按照我以前的经验应该会自动提示切换语言的,但是这次等 ...

  4. typeconfig.json配置说明

    如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录. 不带任何输入文件的情况下调用tsc,编译器会从当前目录开始去查找tsconfig.jso ...

  5. org.springframework.cache.interceptor.SimpleKey cannot be cast to java.lang.String

    springboot整合redis时,使用@Cacheable注解,如果方法的key参数为空,就会报org.springframework.cache.interceptor.SimpleKey ca ...

  6. Fundebug支付宝小程序BUG监控插件更新至0.2.0,新增test()方法,报错增加Page数据

    摘要: 0.2.0新增fundebug.test()方法,同时报错增加了Page数据. Fundebug提供专业支付宝小程序BUG监控服务,可以第一时间为您捕获生存环境中小程序的异常.错误或者BUG, ...

  7. 关于thinkphp5手动抛出Http异常时自定义404页面报错的问题

    在使用HttpException手动抛出异常时,希望跳转到自定义的错误页面,官方的文章中是这样描述的. 可以使用\think\exception\HttpException类来抛出异常 // 抛出 H ...

  8. arcgis api 3.x for js 入门开发系列批量叠加 zip 压缩 SHP 图层优化篇(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  9. 【Android】OkHttp3总结与封装

    开始使用 在app目录下的build.gradle中添加依赖: implementation 'com.squareup.okhttp3:okhttp:3.13.1' implementation ' ...

  10. gitbook 入门教程之快速体验

    本文主要介绍三种使用 gitbook 的方式,分别是 gitbook 命令行工具,Gitbook Editor 官方编辑器和 gitbook.com 官网. 总体来说,三种途径适合各自不同的人群,找到 ...