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

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

 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. 以两种异步模型应用案例,深度解析Future接口

    摘要:本文以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类. 本文分享自华为云社区<[精通高并发系列]两种异步模型与深度解析Future接口(一) ...

  2. Python将字符串转化为对应类名的两种方法

    way first: 1 from django.utils.module_loading import import_string 2 ValidationError = import_string ...

  3. Aria2 任意文件写入

    访问aria2,发现服务已启动并且返回404页面 打开http://binux.github.io/yaaw/demo/#打开yaaw,点击配置按钮,填入运行aria2的目标域名:http://you ...

  4. centos 服务

    1,开机开启服务 #  chkconfig vsftpd on

  5. netty系列之:基于流的数据传输

    目录 简介 package和byte 手动组合 Byte的转换类 ReplayingDecoder 总结 简介 我们知道由两种数据的传输方式,分别是字符流和字节流,字符流的意思是传输的对象就是字符串, ...

  6. 一周内被程序员疯转3.2W次,最终被大厂封杀的《字节跳动Android面试手册》!

    一眨眼又到金三银四了,不知道各位有没有做好跳槽涨薪的准备了呢? 今天的话大家分享一份最新的<字节跳动Android面试手册>,内容包含Android基础+进阶,Java基础+进阶,数据结构 ...

  7. HCNA Routing&Switching之访问控制列表ACL

    前文我们了解了DHCP服务相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15147870.html:今天我们来聊一聊访问控制列表ACL: ACL(ac ...

  8. Let's Encrypt泛域名使用和Nginx配置拆分

    上一期写了 使用Let's Encrypt实现网站https化 ,随着二级域名的增多,每个二级域名需要一张 SSL 证书,这可太不优雅了,泛域名表示我可以更优雅. 作者:IT王小二 博客:https: ...

  9. linux ftp ubuntu18.04 实测有效 完整方法 vsftpd

    https://linuxize.com/post/how-to-setup-ftp-server-with-vsftpd-on-ubuntu-18-04/ 除了此链接完整有效,其他网友 大都残缺不全 ...

  10. js随机显示图片

    定义一个图片数组,生成一个随机数对应数据索引. window.onload = choosePic; function choosePic() { var myPix = new Array(&quo ...