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( ...
随机推荐
- (opencv01)读入图像
(opencv01)Opencv之读入图像 读入图像 img = cv2.imread(filepath, flags) filepath : 要读入图片的完整路径 flags : 读入图片的标志 ...
- GoAhead 远程命令执行漏洞(CVE-2017-17562)
poc地址 https://github.com/ivanitlearning/CVE-2017-17562 执行 msfvenom -a x64 --platform Linux -p linux/ ...
- 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.bat 徐晓亮 595076941@qq.com 2019年12月19日6点50分
@Echo offRem 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.batRem 徐晓亮 595076941@qq.com 2019年12月19日6点50分 Rem 此批处理脚本源代码的 ...
- 浏览器中hook对象属性
先获取window对象属性 来源: 夜幕爬虫安全论坛 原文链接: http://bbs.nightteam.cn/thread-485.htm?orderby=desc&user=7
- RAID磁盘阵列和RAID配置
目录 一.RAID磁盘阵列介绍 二.RAID磁盘阵列分类 2.1.RAID 0(条带化存储) 2.2.RAID 1(镜像存储) 2.3.RAID 5 2.4.RAID 6 2.5.RAID 1+0和0 ...
- Windows上的暗色调Puppet书籍翻译写作环境
翻译环境包括两个部分,写作部分和电子书,Windows上,前者用gVim,后者用SumatraPDF,二者都是绿色软件,都可以定义成暗色系风格. gVim 全屏需要使用一个叫做gvimfullscre ...
- Android 9.0 添加预置第三方输入法/设置默认输入法(软键盘)
前言 在一些Android项目中往往需要预置第三方输入法或自己的输入法,这篇文章就简单讲解如何预置第三方输入法apk及设置默认输入法 结果展示 在介绍基本的调整方法前,先看看效果图, 如下 调整方法 ...
- SpringMVC/boot-CSRF安全方案
1. CSRF原理与防御方案概述 一. 原理 增删改的接口参数值都有规律可循,可以被人恶意构造增删改接口 将恶意构造的增删改接口发给对应特定用户,让特定用户点击 特定用户使用自己的认证信息对该接口发起 ...
- STM32—驱动BT-06蓝牙模块传输数据
文章目录 BT-06简介 数据透传 配置串口 USART1初始化函数 USART2初始化函数 USART2的NVIC配置 USART1串口重映射 BT-06简介 BT06蓝牙模块是专为智能无线数据传输 ...
- 面对对象4 Mixins机制 内置方法 反射 异常
Mixins机制 为什么要有:子类继承父类的时候,可能会碰到需要继承多个父类的情况,那么继承关系也分主类和辅类,既保持主类的功能,也有辅类的功能. 命名方式,我们需要将主类和辅类区分开来,python ...