一个异步任务的梳理
开篇语略;
下图来引出话题:
场景:
个人用户投递简历,由于繁多的业务逻辑判断和数据库的不断读取(这里就不用多说了吧),当个人用户单个/批量投递简历的时候,点击投递按钮之后会很长一段时间等待返回结果。
需求:
提升用户体验,解决点击投递按钮之后的漫长等待,给人一种流畅感,当然不能去掉哪些业务逻辑判断。。
设计:
将投递简历的数据先存放到内存中(不需要参杂任何业务逻辑判断,单纯的存储起来),直接返回投递提示。
做一个独立的投递简历方法,把复杂耗时的操作放到这个方法中,然后操作存储起来的数据。
用异步的方法执行后台任务来调用此方法,执行简历的投递入库。
实现:(这里简单了解一下用到的方法)
数据的存储:Queue(队列)
System.Collections.Queue类表示对象的先进先出集合,存储在 Queue 中的对象在一端插入,从另一端移除。
Queue能对集合进行顺序处理(先进先出),能接受null值,并且允许重复的元素.
先行参考:http://www.cnblogs.com/jiahuafu/archive/2013/01/05/2845640.html
异步的执行:Task(任务)
Task 是架构在线程之上的,也就是说任务最终还是要抛给线程去执行。
Task 跟线程不是一对一的关系,有点类似线程池,但 Task 相比线程池有很小的开销和精确的控制。
强烈推荐:http://www.cnblogs.com/woxpp/p/3928788.html
封装好的Task方法:http://www.cnblogs.com/Googler/archive/2010/06/05/1752213.html
测试代码:
/// <summary> /// 投递简历 /// </summary> public class PostResumeQueue { private static readonly Queue<string> _pQueue = new Queue<string>(); /// <summary> /// 进队列 存入两个ID /// </summary> /// <param name="resumeId"></param> /// <param name="infoId"></param> public static void PostResumeToQueue(int resumeId, int infoId) { _pQueue.Enqueue(string.Format("{0}-{1}", resumeId, infoId)); } /// <summary> /// 异步执行任务 投递简历 /// </summary> /// <returns></returns> public static void PostResumeToDbAsync() { var task = new Task(PostResumeToDb); task.Start(); } /// <summary> /// 投递简历入库 /// </summary> /// <returns></returns> public static void PostResumeToDb() { while (_pQueue.Count != 0) { //取出分解两个ID var q = _pQueue.Dequeue(); var qArr = q.Split('-'); var resumeId = 0; int.TryParse(qArr[0], out resumeId); var infoId = 0; int.TryParse(qArr[1], out infoId); //这里 调用/书写 投递简历的方法体{ *** } } } }
简单的梳理一下 有什么好的建议或意见都可以提出来!<( ̄▽ ̄)> 哇哈哈…
参考文章:https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task.aspx