zoukankan      html  css  js  c++  java
  • 一个异步任务的梳理

    开篇语略;

    下图来引出话题:

      

    场景:

      个人用户投递简历,由于繁多的业务逻辑判断和数据库的不断读取(这里就不用多说了吧),当个人用户单个/批量投递简历的时候,点击投递按钮之后会很长一段时间等待返回结果。

      

    需求:

      提升用户体验,解决点击投递按钮之后的漫长等待,给人一种流畅感,当然不能去掉哪些业务逻辑判断。。

    设计:

      将投递简历的数据先存放到内存中(不需要参杂任何业务逻辑判断,单纯的存储起来),直接返回投递提示。

      做一个独立的投递简历方法,把复杂耗时的操作放到这个方法中,然后操作存储起来的数据。

      用异步的方法执行后台任务来调用此方法,执行简历的投递入库。

      

    实现:(这里简单了解一下用到的方法

      数据的存储: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

  • 相关阅读:
    【C】——sigprocmask 阻塞进程信号
    【C】——setjmp练习
    【程序练习】——交换两数组元素,使之和差最小
    【C】——setvbuf(scanf内存溢出问题)
    【C】——APUE小程序之递归遍历目录
    Java的原始类型(Primitive Type)
    类加载 静态加载
    行政拘留不属于行政强制措施
    行政立法主体
    行政法中三大具体行政行为
  • 原文地址:https://www.cnblogs.com/atxgs/p/4600180.html
Copyright © 2011-2022 走看看