C# ThreadPool 分批处理数据,所有数据执行完再返回
2021/9/4 12:05:48
本文主要是介绍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 分批处理数据,所有数据执行完再返回的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#