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

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

 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 分批处理数据,所有数据执行完再返回的更多相关文章

  1. 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)

    1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...

  2. 方法不会等待Task执行完才返回数据

  3. (testng多个class文件执行时混乱,不是等一个class内的所有methods执行完再去执行下一个class内的内容)问题的解决

    问题描述如下: We use TestNG and Selenium WebDriver to test our web application. Now our problem is that we ...

  4. c# Process cmd 执行完回调 Proc_OutputDataReceived mysql mysqldump mysql source备份还原数据

    c# Process 执行完回调 Proc_OutputDataReceived mysql mysqldump mysql source备份还原数据 直接贴代码 前提:mysql5.7 vs2017 ...

  5. HTML或者JSP页面--执行完某事件后刷新页面,重置表单,清空数据

    在提交表单或者执行某个事件之后,如果需要重置表单(即清空表单里的数据) 可以执行下面代码来完成 方式一: self.location.href="userController.do?goAd ...

  6. 在SAS数据步中执行过程步的简单示例

    SAS中的许多过程步都是封装好的,而且SAS的编程特点决定了只能是DATA步执行完之后再执行PROC步,或者PROC步执行完之后再执行DATA步.因此有时候DATA步只能利用PROC步执行完之后的结果 ...

  7. 计算属性 vs 侦听属性 当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的

    https://cn.vuejs.org/v2/guide/computed.html#基础例子 计算属性 vs 侦听属性 Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属 ...

  8. ajax验证用户名 当用户名框的数据改变时 执行ajax方法

    ajax验证用户名 当用户名框的数据改变时 执行ajax方法 <html xmlns="http://www.w3.org/1999/xhtml" ><head ...

  9. 2016/05/13 thinkphp 3.2.2 ① 数据删除及执行原生sql语句 ②表单验证

    [数据删除及执行原生sql语句] delete()  返回受影响的记录条数 $goods -> delete(30);   删除主键值等于30的记录信息 $goods -> delete( ...

随机推荐

  1. C实现奇偶校验

    奇偶校验原理(来自百度百科):奇偶校验(Parity Check)是一种校验代码传输正确性的方法.根据被传输的一组二进制代码的数位中"1"的个数是奇数或偶数来进行校验.采用奇数的称 ...

  2. jquery点击空白处事件

    $(document).live('click',function(){       $('.emails').hide();   }); 此代码为点击空白处,'emails',标签隐藏.

  3. Centos8部署jdk、mysql8、tomcat,并部署项目到tomcat中

    目录 Linux系统的学习与使用(Centos8) Linux系统的介绍 为什么要选择Linux作为服务器运行的操作系统 目录结构 使Linux系统能够联网(登录root用户) 常用命令 cd命令(用 ...

  4. 记录21.07.20 —— js语言回顾

    js语言回顾 1.语法 a并没有声明,也可以输出,不会报错. 添加一条语句 则需要声明,称之为严谨语法 2.数组 2.1数组遍历三种方法 for-in与for-of forEach forEach调用 ...

  5. 8.8考试总结(NOIP模拟33)[Hunter·Defence·Connect]

    无法逃避的是自我,而无法挽回的是过去. 前言 还算可以,不过 T1 少 \(\bmod\) 了一下挂了 25pts,T2 没看清题面挂了 27pts. 下回注意吧.. T1 Hunter 解题思路 感 ...

  6. C++ 多态 案例(//多态案例----制作饮品 //描述:煮水 冲泡 倒入杯中 加入辅料)

    1 //多态案例----制作饮品 2 //描述:煮水 冲泡 倒入杯中 加入辅料 3 4 #include <iostream> 5 #include <string> 6 us ...

  7. 内置函数 字符串比较 strcmp 登录密码

    1 //内置函数 字符串比较 strcmp 2 // 原理:将两个字符串从首字母开始,按照ASCII码的顺序逐个比较 3 //字符串1 == 字符串2 返回0 4 //字符串1 < 字符串2, ...

  8. Git-08-标签管理

    标签管理 Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针 跟分支很像对不对?但是分支可以移动,标签不能移动 所以,创建和删除标签都是瞬间完成的 Git有commit,为什么还要 ...

  9. SpringBoot开发五-社区首页开发

    需求介绍-社区首页 根据之前的学习,我们一般都是先按照DAO->Service->Controller这个顺序去开发 分布实现: 开发社区首页,显示前十个帖子. 开发分页组件,分页显示所有 ...

  10. vivo商城计价中心 - 从容应对复杂场景价格计算

    一.背景 随着vivo商城的业务架构不断升级,整个商城较为复杂多变的营销玩法被拆分到独立的促销系统中. 拆分后的促销系统初期只是负责了营销活动玩法的维护,促销中最为重要的计价业务仍然遗留在商城主站业务 ...