主线程:

         private void GetPolicy_Load(object sender, EventArgs e)
{
////ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadSP));
try
{
MessageBox.Show("开始");
ManualResetEvent[] _ManualEvents = new ManualResetEvent[];
_ManualEvents[] = new ManualResetEvent(false);
_ManualEvents[] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadSP2), _ManualEvents[]); foreach (var v in _ManualEvents)
{
v.WaitOne();
}
// 线程结束后执行后面的主线程代码
MessageBox.Show("结束了");
}
catch (Exception ex)
{ }
}
ThreadSP2方法:
 //
private void ThreadSP2(object obj)
{ ////处理方法
//string sql = "select id,start,end from tb";
//DataTable dt = SqlHelper.ExecuteDataset("连接字符串", System.Data.CommandType.Text, sql, null).Tables[0];
//List<string> list;
//for (int i = 0; i < dt.Rows.Count; i++)
//{
// list = new List<string>();
// list.Add(dt.Rows[i]["start"] + ";" + dt.Rows[i]["end"] + ";" + dt.Rows[i]["id"]);
// GJShopping2 s1 = new GJShopping2();
// ThreadPool.QueueUserWorkItem(new WaitCallback(s1.GetShopping), list);
// Thread.Sleep(1500);
//}
MessageBox.Show("ThreadSP2 方法执行了");
ManualResetEvent e = (ManualResetEvent)obj;
e.Set();
}

========线程队列控制并发

private Dictionary<List<string>, Thread> _ThreadDictionary = new Dictionary<List<string>, Thread>();   //存储采集任务线程
private int _MaxThreadCount = 20; //最大允许多少并发线程进行采集数据
DataTable dt = SqlHelper.ExecuteDataset("连接字符串", System.Data.CommandType.Text, sql, null).Tables[0];
List<string> list;
for (int i = 0; i < dt.Rows.Count; i++)
{
list = new List<string>();
list.Add(dt.Rows[i]["fromcity"] + ";" + dt.Rows[i]["tocity"] + ";" + dt.Rows[i]["policysettingid"]);
SPHandler hd = new SPHandler();
_ThreadDictionary.Add(list, new Thread(new ParameterizedThreadStart(hd.GetShopping), 5));
//hd.GetShopping 带参数方法(处理数据)
//ThreadPool.QueueUserWorkItem(new WaitCallback(hd.GetShopping), list);
//Thread.Sleep(1000 * 2 * 1);
}
#region 线程队列处理
if (_ThreadDictionary.Count > 0)
{
int maxThreadSize = _MaxThreadCount; //最大并发线程数量
int totalThreadCount = _ThreadDictionary.Count; //总线程数量 while (totalThreadCount > 0)
{
int worksThreadSize = _ThreadDictionary.Where(k => k.Value.IsAlive).Count(); //当前活动线程数量 if (worksThreadSize < maxThreadSize)
{
foreach (KeyValuePair<List<string>, Thread> item in _ThreadDictionary.Where(k => k.Value.ThreadState.Equals(ThreadState.Unstarted)))
{
item.Value.Start(item.Key);
worksThreadSize++;
totalThreadCount--;
//达到最大活跃线程数量则跳出 Foreach 循环 , 重新执行 while 中代码.
if (worksThreadSize == maxThreadSize)
break;
}
}
}
//等待所有线程操作完成
while (_ThreadDictionary.Where(k => k.Value.IsAlive).Count() > 0) { }
}
#endregion

 ==== GetShopping(带参数方法,处理数据)

 public void GetShopping(object obj)
{
List<string> listtable = obj as List<string>;
DateTime dtstart = DateTime.Now.AddDays(1);
DateTime dtend = Convert.ToDateTime(dtstart.AddMonths(1).ToString("yyyy-MM") + "-01");
dtend = dtend.AddDays(-1); //暂时跑T+3,T+33时间段数据测试
dtstart = DateTime.Now.AddDays(3);
dtend = dtstart.AddDays(30);
List<string> listids = new List<string>();
List<string> listidstemp = new List<string>();
string[] array;
for (int i = 0; i < listtable.Count; i++)
{
array = listtable[i].Split(';');
//遍历起止日期
for (DateTime dt = dtstart; dt <= dtend; dt = dt.AddDays(1))
{
EWin.International.PolicyForm.SPService.AirFareFlightShopRequest req = new EWin.International.PolicyForm.SPService.AirFareFlightShopRequest();
req.UName = SP_UID;
req.UPassword = SP_PWD;
req.StartCity = array[0];
req.EndCity = array[1];
req.SearchDateDt = dt;
if (SaveToDB(req))
{
listids.Add(array[2]);
}
else
{
listidstemp.Add(array[2]);
}
}
}
listidstemp = listidstemp.Distinct().ToList();
if (listidstemp.Count > 0)
{
BllPolicysetting.UpdateState(listidstemp, "N", listidstemp.Count, Config.CONSQL_WRITE_ETWIN_INTERNATIONAL_DB);
listidstemp.Clear();
}
listids = listids.Distinct().ToList();
if (listids.Count > 0)
{
BllPolicysetting.UpdateState(listids, "N", 0, Config.CONSQL_WRITE_ETWIN_INTERNATIONAL_DB);
listids.Clear();
}
}

  

多线程操作(ThreadPool.QueueUserWorkItem的更多相关文章

  1. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  2. 多线程实现Thread.Start()与ThreadPool.QueueUserWorkItem两种方式对比

    Thread.Start(),ThreadPool.QueueUserWorkItem都是在实现多线程并行编程时常用的方法.两种方式有何异同点,而又该如何取舍? 写一个Demo,分别用两种方式实现.观 ...

  3. C#中级-常用多线程操作(持续更新)

    一.前言       多线程操作一直是编程的常用操作,掌握好基本的操作可以让程序运行的更加有效.本文不求大而全,只是将我自己工作中常常用到的多线程操作做个分类和总结.平时记性不好的时候还能看看.本文参 ...

  4. C#多线程操作界面控件的解决方案(转)

    C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...

  5. 【多线程】-ThreadPool线程池

    ThreadPool介绍: Thread类是一个静态类,所有不存在实例化构造函数操作,直接可以调用其内所存在的方法. 微软官网给出的解释: 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 ...

  6. .net 多线程 Thread ThreadPool Task

    先准备一个耗时方法 /// <summary>/// 耗时方法/// </summary>/// <param name="name">< ...

  7. C# 多线程操作实例

    1.多线程操作 一旦打开线程就必须记得关闭 1.第一部分 这是个数字叠加小功能 private void CountTo(int countTo, CancellationToken ct) { ; ...

  8. .NET多线程(Thread,ThreadPool,Task,Async与Await)

    .NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...

  9. C# 实现一个可取消的多线程操作 示例

    private void button1_Click(object sender, EventArgs e) { //定义一个为可取消资源标志 CancellationTokenSource cts ...

随机推荐

  1. ui-bootstrap-tpls-0.11.0.min.js

  2. setInterval 函数传参(方法一)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 【转帖】ios上取得设备唯一标志的解决方案

    原文地址:http://lqzit.iteye.com/blog/2070306 注意:keychina设置完之后,项目目录里的“项目名.entitlements”文件不是手动创建出的,而是在按照如下 ...

  4. XACT_ABORT 用法

    首先创建一张表 Create Table TranTable(    Id INT IDENTITY(1,1) PRIMARY KEY,    Priority TINYINT--最大值255) 1. ...

  5. Sqlserver 远程连接的 TCP/IP 和 Named Pipes的区别

    TCP/IP:  TCP/IP是 Internet 上广泛使用的通用协议.它与互连网络中硬件结构和操作系统各异的计算机进行通信.TCP/IP包括路由网络流量的标准,并能够提供高级安全功能.它是目前在商 ...

  6. 图像质量评价指标之Matlab实现

    在图像处理算法研究中,很多时候需要有客观评价指标来对算法的性能进行评价. 比如,在图像复原.图像滤波算法研究中,需要采用客观评价指标来定量的来测试算法恢复出的图像相对于参考图像的好坏程度. 本文介绍文 ...

  7. UVa 10935卡片游戏

    很简单的一个题目,就是队列的运用就可以了,就是注意一下1的时候的情况就可以了. #include<iostream> #include<queue> using namespa ...

  8. Servlet 中文乱码问题及解决方案剖析

    转自:http://blog.csdn.net/xiazdong/article/details/7217022/ 一.常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK ...

  9. oracle锁机制

    1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据 库执行请求,T2代表另一个请求,也可以理解为T1为 ...

  10. spark-scheduled调度算法

    1.3源码是如此,后面新版本源码会尽可能的根据用户shell配置的参数进行分配 1.spareadOutApps 尽可能分配到多的机器上面execute和CPU core 2.非spareadouta ...