1. 注意 Task 执行的顺序。

如下代码:

             IQueryable<T> querySet;
if (preConditionExpression == null)
{
querySet = Table; // 原来是 TableWhereUnDeleted
}
else
{
querySet = Table.Where(preConditionExpression); //原来是 TableWhereUnDeleted.Where(preConditionExpression);
}
if (conditionCombined != null && condition != null)
{
querySet = conditionCombined(querySet, condition);
}
int recordCount = await querySet.CountAsync();
querySet = SkipAndTakeInternal(querySet, skip, take, orderKeySelector);
var list = await querySet.ToListAsync();
return new LightPagedList<T>()
{
DataList = list,
RecordCount = recordCount
};

这个方法有一个问题,就是第 15 行没有 await,这样执行的时候有一个 BUG,其实第 14 行和第 15 行几乎是同时执行,虽然第 14 行有一个 await,但仅仅是把第 14 行的返回值赋值给 int recordCount,而第 15 行同时执行了,导致最终 LightPagedLIst 的 DataList 为 NULL。

还有一个问题,切记不要把 LightPagedList 放到匿名方法体以内,那样  LightPagedList  始终得不到值。

推荐如下代码:

             IQueryable<T> querySet;
if (preConditionExpression == null)
{
querySet = Table; // 原来是 TableWhereUnDeleted
}
else
{
querySet = Table.Where(preConditionExpression); //原来是 TableWhereUnDeleted.Where(preConditionExpression);
}
if (conditionCombined != null && condition != null)
{
querySet = conditionCombined(querySet, condition);
}
LightPagedList<T> result = new LightPagedList<T>();
Task<int> task1 = querySet.CountAsync();
result.RecordCount = await task1;
Task<IQueryable<T>> task2 = task1.ContinueWith<IQueryable<T>>(t =>
{
return SkipAndTakeInternal(querySet, skip, take, orderKeySelector);
});
result.DataList = await task2.ContinueWith(t =>
{
return t.Result.ToListAsync();
}).Result;
return result;

谢谢浏览!

Task 小记的更多相关文章

  1. 编剧小记 — Contour

    前言 Contour 是一款比较优秀的编剧辅助软件,按理说这篇文章应该归类到mac小记中,但其操作非常简单,基本上以写作提示为主.只怪所有提示都是英语,而且很多,每次使用打开 Contour 个别单词 ...

  2. 使用Maven自动部署Java Web项目到Tomcat问题小记

    导读 首先说说自己为啥要用maven管理项目,一个直接的原因是:我在自己电脑上开发web项目,每次部署到服务器上时都要经历如下步骤: 首先在Eclipse里将项目打包成war包 将服务器上原来的项目文 ...

  3. WPF ControllTemplate Triggers小记 - 简书

    原文:WPF ControllTemplate Triggers小记 - 简书 WPF中,样式模板中如果定义EventTrigger事件方式实现动画.那么需要注意两点: 1.对于绑定的属性的Event ...

  4. ConCurrent in Practice小记 (4)

    ConCurrent in Practice小记 (4) Executors Callable && Future <T> Callable:此接口有一个call()方法. ...

  5. Concepts:Request 和 Task

    当SQL Server Engine 接收到Session发出的Request时,SQL Server OS将Request和Task绑定,并为Task分配一个Workder.在TSQL Query执 ...

  6. .Net多线程编程—任务Task

    1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 object AsyncState 表示在 ...

  7. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  8. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

  9. [原]Paste.deploy 与 WSGI, keystone 小记

    Paste.deploy 与 WSGI, keystone 小记 名词解释: Paste.deploy 是一个WSGI工具包,用于更方便的管理WSGI应用, 可以通过配置文件,将WSGI应用加载起来. ...

随机推荐

  1. Lucene BooleanQuery相关算法

    BooleanQuery对两种不同查询场景执行不同的算法: 场景1: 所有的子句都必须满足,而且所有的子句里没有嵌套BooleanQuery. 例: a AND b AND c 上面语句表示要同时包含 ...

  2. IOC : Unity 配置和使用

    原文出自:IOC : Unity 配置和使用 之前Terry Lee 已经介绍过Unity的简单使用了,不过那篇文章是针对旧版本的,现在的版本1.2版略有不同. 我下载了Unity并做了一个简单的测试 ...

  3. vue中输入框只能输入数字

    方案1:增加自定义指令 自定义指令写法:      directives: {         numberOnly: {             bind(el) {                 ...

  4. svn导一份历史版本出来

    然后: 点击最上面的Show log ; 选择你要的版本: 右键, export, 然后就可以选择需要导出的文件夹 主要有时候开发新功能然后覆盖到项目里面去了,但是产品可能需要在旧版本上面修改其他东西 ...

  5. springcloud学习之路: (四) springcloud集成Hystrix服务保护

    Hystrix是一套完善的服务保护组件, 可以实现服务降级, 服务熔断, 服务隔离等保护措施 使用它可以合理的应对高并发的情况 做到保护服务的效果 1. 导入依赖 <dependency> ...

  6. 201871010104-陈园园 《面向对象程序设计(java)》第六——七周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第六——七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daiz ...

  7. Pycharm工具使用和安装

    1.安装包:https://pan.baidu.com/s/1O9JwuowlodhTR1m0VaKmhg 2.双击安装包安装: 3.选择安装目录 4.安装选项,Create Associations ...

  8. MySQL8 修改密码验证插件

    MySQL8 修改密码验证插件 查看当前用户使用的密码验证插件 mysql> show variables like '%auth%'; +--------------------------- ...

  9. Excel-数据透视表

    例如: 购买数量采用求和的方式 用户数ID数据采用计数的方式 一.数据透视表的结构 二.数据透视表的步骤 1.订单表 提出问题,理解数据,数据清晰,构建模型,数据可视化 问题1:每个客户的订单量? 问 ...

  10. vue项目的安装与启动

      第一步:安装Node 检测Node是否安装成功 node -v 第二步:安装vue-cli     命令:npm install vue-cli -g 第三步:搭建项目命令 vue init we ...