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( ...
随机推荐
- MySQL是怎么解决幻读问题的?
前言 我们知道MySQL在可重复读隔离级别下别的事物提交的内容,是看不到的.而可提交隔离级别下是可以看到别的事务提交的.而如果我们的业务场景是在事物内同样的两个查询我们需要看到的数据都是一致的,不能被 ...
- 用KeePass管理密码并用Synology_Drive或者GoodSync实时双向同步电脑桌面和群晖NAS2021年8月5日
用KeePass管理密码并用Synology_Drive或者GoodSync实时双向同步电脑桌面和群晖NAS2021年8月5日 我通常会把所有办公文档.办公表格和办公图片都实时同步保存到 Synolo ...
- 直接使用!安装WordPress一键部署轻松建站教程
关于 WordPress WordPress (opens new window)简称WP,最初是一款博客系统,后逐步演化成一款功能强大的企业级 CMS(内容管理/建站系统),目前是公认的全球最佳建站 ...
- [ZJOI2010]基站选址,线段树优化DP
G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...
- 进入mysql的学习>从零开始学JAVA系列
目录 MySQL的学习 什么是MYSQL 安装MYSQL Window安装MYSQL(压缩包版) 什么是MYSQL 安装MYSQL Window安装MYSQL(压缩包版) MYSQL基本指令 DDL ...
- 使用scrapy搭建大型爬虫系统
最近新项目准备启动,在开始前内容.词库这些都需要提前做好准备,所以就有了这篇文章.在开始动手,看了下行业核心词排在首页的站,发现内容都多得不要不要的,各种乱七八糟的频道.页面模板,心想,如果每个网站. ...
- Ubuntu开启SSH端口并且搭建Vulhub环境
1.下载好ubuntu.开启SSH: * sudo apt update * sudo apt install openssh-server * sudo systemctl status ssh 用 ...
- 用 区间判断(if)来猜价格的高低
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int price = 150; 6 int gue ...
- Python之replace()方法失效
1.背景 Titanic存活率预测案例: # 读取数据 df_train = pd.read_csv("./data/train.csv") df_train.head() OUT ...
- Golang语言系列-11-goroutine并发
goroutine 并发 概念 package main import ( "fmt" "time" ) /* [Go语言中的并发编程 goroutine] [ ...