ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# ThreadPool 分批处理数据,所有数据执行完再返回

2021-09-04 12:02:24  阅读:203  来源: 互联网

标签:Count pra pageSize C# 完再 ThreadPool item null response


这是一个调用翻译数据的功能,所有数据一次性提交会造成后台服务压力大,接口反应时间也长。

所以做了一个分批处理,等待所有批次的数据调用接口都返回后再执行下一步。

 

 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

 

标签:Count,pra,pageSize,C#,完再,ThreadPool,item,null,response
来源: https://www.cnblogs.com/qigao/p/15226213.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有