C# ThreadPool 分批处理数据,所有数据执行完再返回
这是一个调用翻译数据的功能,所有数据一次性提交会造成后台服务压力大,接口反应时间也长。
所以做了一个分批处理,等待所有批次的数据调用接口都返回后再执行下一步。
1 /// <summary>
2 /// 自动翻译
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void Item_Click(object sender, EventArgs e)
7 {14 List<hsCodeDictionaryEntity> hsCodeDictionary = GetMatchSelectedHawbItemsList(); //获取数据20 if (hsCodeDictionary.Count > 30) //大于30条数据就分批处理
21 {
22 ShowProcessBar(true, "正在自动匹配,请稍候...");
23 int pageSize = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(Convert.ToDouble(hsCodeDictionary.Count) / 6)));
24 ToPagingProcess(hsCodeDictionary, pageSize); //主要是这个方法
25 ShowProcessBar(true, "正在刷新界面数据,请稍候...");
26 this.tbtnRefresh_Click(null, null); //刷新界面28 }
29 else
30 {
31 #region
32 TODO69 #endregion
70 }
71 }
下面的代码就是处理分批执行,同时调用多次接口方法,所有返回结果之后就退出。
        #region
        private void ThreadMethod(object obj)
        {
            Param pra = (Param)obj;
            //等待5秒,用于模拟系统在处理事情
            try
            {
                OnMatchHsCodeByHawbHandler caller = new OnMatchHsCodeByHawbHandler(OnAssignMatchHsCode);   //调用后台接口
                IAsyncResult result = caller.BeginInvoke(pra.hsCodeDictionaryList, Constant.CurrentFlow, null, null);
                while (result.IsCompleted == false)
                {
                    Application.DoEvents();
                    Thread.Sleep(10);
                }
                Response response = caller.EndInvoke(result);
                if (response != null)
                {
                    switch (response.status)
                    {
                        case 1:
                            //this.tbtnRefresh_Click(null, null);
                            break;
                        case 0:
                            string errMsg = GetErrorInfor(response.errCode);
                            logger.Error("自动匹配hscode保存出错。错误信息:" + errMsg + ",错误原因:" + response.error);
                            break;
                    }
                }
                else
                {
                    logger.Error("自动匹配hscode保存出错。错误信息:" + Properties.Resources.WSReturnNullResponse + ",错误原因:" + response.error);
                }
            }
            catch (Exception ex)
            {
                logger.ErrorException("matchHsCodeByHawb_Click()", ex);
            }
            pra.mrEvent.Set();
            lock (locker)
            {
                finishcount++;
                Monitor.Pulse(locker); //完成,通知等待队列,告知已完,执行下一个。
            }
        }
        int _ThreadCount = 6;
        int finishcount = 0;
        object locker = new object();
        List<ManualResetEvent> manualEvents = new List<ManualResetEvent>();
        protected void ToPagingProcess<TEntity>(IEnumerable<TEntity> item, int pageSize)
        {
            finishcount = 0;
            if (item != null && item.Count() > 0)
            {
                var count = item.Count();
                var pages = item.Count() / pageSize;
                if (count % pageSize > 0)
                {
                    pages += 1;
                }
                for (int i = 1; i <= pages; i++)
                {
                    var currentPageItem = item.Skip((i - 1) * pageSize).Take(pageSize);
                    ManualResetEvent mre = new ManualResetEvent(false);
                    manualEvents.Add(mre);
                    Param pra = new Param();
                    pra.mrEvent = mre;
                    pra.hsCodeDictionaryList = new List<hsCodeDictionaryEntity>();
                    foreach (var itm in currentPageItem)
                    {
                        pra.hsCodeDictionaryList.Add(itm as hsCodeDictionaryEntity);
                    }
                    ThreadPool.QueueUserWorkItem(ThreadMethod, pra);
                }
                lock (locker)
                {
                    while (finishcount != _ThreadCount)
                    {
                        Monitor.Wait(locker);//等待
                    }
                }
            }
        }
        #endregion
C# ThreadPool 分批处理数据,所有数据执行完再返回的更多相关文章
- 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)
		1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ... 
- 方法不会等待Task执行完才返回数据
- (testng多个class文件执行时混乱,不是等一个class内的所有methods执行完再去执行下一个class内的内容)问题的解决
		问题描述如下: We use TestNG and Selenium WebDriver to test our web application. Now our problem is that we ... 
- c# Process cmd 执行完回调 Proc_OutputDataReceived  mysql mysqldump mysql source备份还原数据
		c# Process 执行完回调 Proc_OutputDataReceived mysql mysqldump mysql source备份还原数据 直接贴代码 前提:mysql5.7 vs2017 ... 
- HTML或者JSP页面--执行完某事件后刷新页面,重置表单,清空数据
		在提交表单或者执行某个事件之后,如果需要重置表单(即清空表单里的数据) 可以执行下面代码来完成 方式一: self.location.href="userController.do?goAd ... 
- 在SAS数据步中执行过程步的简单示例
		SAS中的许多过程步都是封装好的,而且SAS的编程特点决定了只能是DATA步执行完之后再执行PROC步,或者PROC步执行完之后再执行DATA步.因此有时候DATA步只能利用PROC步执行完之后的结果 ... 
- 计算属性 vs 侦听属性  当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的
		https://cn.vuejs.org/v2/guide/computed.html#基础例子 计算属性 vs 侦听属性 Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属 ... 
- ajax验证用户名 当用户名框的数据改变时 执行ajax方法
		ajax验证用户名 当用户名框的数据改变时 执行ajax方法 <html xmlns="http://www.w3.org/1999/xhtml" ><head ... 
- 2016/05/13   thinkphp 3.2.2     ① 数据删除及执行原生sql语句       ②表单验证
		[数据删除及执行原生sql语句] delete() 返回受影响的记录条数 $goods -> delete(30); 删除主键值等于30的记录信息 $goods -> delete( ... 
随机推荐
- dva的effect那么难用,自己造一个轮子吧
			背景 对于dva这个开发框架,国内从事react的前端工程师多半不会感到陌生,dva完善的开发体系和简单的api,让其被广泛运用到实际工作中.我所在的公司也是长期使用dva作为基础的开发框架,虽然好用 ... 
- python爬虫--案例分析之针对简单的html文件
			python爬虫常用的库:Python 库(urllib.BeautifulSoup.requests.scrapy)实现网页爬虫 python爬虫最简单案例分析: 对一个html文件进行分解,获取 ... 
- 添加底部导航栏tabbar
			效果图: 如果要添加底部导航栏,最少2个,最多5个. app.json { "pages": [ "pages/index/index", "page ... 
- shell脚本(12)-特殊变量介绍
			一.特殊变量介绍: 1.$* :代表所有参数,其间隔为IFS内参数的第一个字元 2.$@ :与*星号类同,不同之处在于不参照IFS 3.$# :代表参数数量 4.$: 代表上一个指令的返回值 5.$- ... 
- 我眼中的java线程池实现原理
			最近在看java线程池实现方面的源码,在此做个小结,因为网上关于线程池源码分析的博客挺多的,我也不打算重复造轮子啦,仅仅用纯语言描述的方式做做总结啦! 个人认为要想理解清楚java线程池实现原理,明白 ... 
- 群晖NAS网络存储服务器防盗防小偷
			群晖NAS网络存储服务器防盗防小偷 根据群晖NAS的实际测量外形尺寸到淘宝网邮购金属 配电箱(弱电箱). 把配电箱(弱电箱)用粗螺丝固定到机柜或墙壁上. 把群晖NAS用密码纯铜挂锁锁在配电箱(弱电箱 ... 
- Go测试技术分享(一):场景化接口Case编写
			一.前言 本人负责的支付清结算方向的测试工作,在测试项目中,会出现流程化的接口调用,请求完一个接口后,继续请求另一个接口(这里的接口可以指Http,也指rpc接口),这里以一个真实场景为例:用户在平台 ... 
- API接口测试
			一.测试工具 二.测试方法 二.测试需要注意的点 
- HDFS(Hadoop Distributed File System )概述
			目录 一.HDFS概述 二.HDFS特点 三.HDFS集群组成:主从架构---一个主节点,多个从节点 1. NameNode(名称节点 / 主节点)----- HDFS集群的管理者 2. DataNo ... 
- 简单的整合 shiro + SpringMVC 例子
			简单的整合shiro和springmvc的例子 想要整合Shiro和springmvc,在网上找了很多例子,感觉都有一点复杂.所以就自己写了一个最简单整合项目,记录在这里以备后面查看. 这个例子包含如 ... 
