c# ThreadPool 判断子线程全部执行完毕的四种方法
1、先来看看这个
多线程编程
多线程用于数据采集时,速度明显很快,下面是基本方法,把那个auto写成采集数据方法即可。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{ ThreadPool.SetMaxThreads(3, 3); //设置最大线程数
for (int i = 0; i < 10; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Auto), i);//线程池指定线程执行Auto方法
}
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} public static void Auto(object i)//多线程执行的方法
{
if (string.Equals(i,2))
{
Thread.Sleep(2000);
}
Console.WriteLine(i.ToString());
}
}
}
明白吧,就是多线程执行顺序是不确定的。
2、再来看看这个结果
static void Main(string[] args)
{
try
{
ThreadPool.SetMaxThreads(3, 3); //设置最大线程数
for (int i = 0; i < 10; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Auto), i);//线程池指定线程执行Auto方法
} }
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} Console.WriteLine("结束了"); //这句要改
Console.ReadLine();
} public static void Auto(object i)//多线程执行的方法
{
if (string.Equals(i, 2))
{
Thread.Sleep(2000);
}
Console.WriteLine(i.ToString());
}
结束了 这三个字不一定 真正在 最后一行输出。因为这时是 主线程+子线程 这些线程的执行顺序不确定,可能主线程老早就执行了。也就说可能结束了 这三个字很早就会输出。
3、主题 保证 结束了 在最后输出。
方法1:
//这是主线程,一直都会执行。目前一直在进行的是 一个主线程+多个子线程
while (true)
{
Thread.Sleep(1000);//这句写着,主要是没必要循环那么多次。去掉也可以。
int maxWorkerThreads, workerThreads;
int portThreads;
ThreadPool.GetMaxThreads(out maxWorkerThreads, out portThreads);
ThreadPool.GetAvailableThreads(out workerThreads, out portThreads);
if (maxWorkerThreads - workerThreads == 0)
{
Console.WriteLine("结束了");
break;
}
}
GetAvailableThreads():检索由 GetMaxThreads 返回的线程池线程的最大数目和当前活动数目之间的差值。
而GetMaxThreads 检索可以同时处于活动状态的线程池请求的数目。
通过最大数目减可用数目就可以得到当前活动线程的数目,如果为零,那就说明没有活动线程,说明所有线程运行完毕。
方法2 : Monitor
见下篇文章:http://hi.baidu.com/handboy/blog/item/681d093875d6e6cdd56225ae.html
class Program
{
static object locker = new object();
static int runningThreads = 0;
static void Main(string[] args)
{
try
{
ThreadPool.SetMaxThreads(4, 4); //设置最大线程数 using System.Threading;
runningThreads = 10;
for (int i = 0; i < runningThreads; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Auto), i);//线程池指定线程执行Auto方法
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
lock (locker)
{
while (runningThreads > 0)
{
Monitor.Wait(locker);
}
}
Console.WriteLine("结束了");
Console.ReadLine();
}
public static void Auto(object i)//多线程执行的方法
{
if (string.Equals(i, 2))
{
Thread.Sleep(2000);
}
lock (locker)
{
runningThreads--;
Monitor.Pulse(locker);
}
Console.WriteLine(i.ToString());
}
}
方法3:WaitHandle (推荐用这个方法)
。http://hi.baidu.com/ganggang0217/blog/item/fe2a004ecad3acdcd0c86a67.html
public void testThreads()
{
ManualResetEvent[] _ManualEvents = new ManualResetEvent[10];
for (int i = 0; i < 10; i++)
{
_ManualEvents[i] = new ManualResetEvent(false);
System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(testMethod), _ManualEvents[i]);
}
WaitHandle.WaitAll(_ManualEvents);
// 线程结束后执行后面的主线程代码
Console.WriteLine("结束了");
Console.ReadLine();
}
public void testMethod(object objEvent)
{
//TODO: Add your code here
ManualResetEvent e = (ManualResetEvent)objEvent;
e.Set();
}
c# ThreadPool 判断子线程全部执行完毕的四种方法的更多相关文章
- ThreadPool怎样判断子线程全部执行完毕
原文发布时间为:2010-10-27 -- 来源于本人的百度文章 [由搬家工具导入] 1、先来看看这个 http://hi.baidu.com/handboy/blog/item/160e9697fd ...
- 子线程更新UI界面的2种方法
一.一般我们都会在子线程完成一些耗时的操作. 1.Android中消息机制: 2.知识点: Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队, ...
- Android子线程中更新UI的4种方法
方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...
- 老问题:Android子线程中更新UI的3种方法
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handle ...
- Android 在子线程中更新UI的几种方法
第一种: new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { // 在这里 ...
- Python执行系统命令的四种方法
一.os.system方法 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态.执行后返回两行结果,第一行是结果, 第二行是执行状态信息,如果命令成功执行,这条语句返回0,否则返回1 ...
- Python中执行系统命令的四种方法
一.os.system方法 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态.执行后返回两行结果,第一行是结果, 第二行是执行状态信息,如果命令成功执行,这条语句返回0,否则返回1 ...
- Python—执行系统命令的四种方法
一.os.system方法 这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息. os.system(cmd)的返回值.如果执行成功,那么会 ...
- C#定时检測子线程是否已经完毕
C#定时检測子线程是否已经完毕 class Program { static void Main(string[] args) { //主线程中启动一个支线程,运行doSomething这种一个方法. ...
随机推荐
- 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V1 -- 本地方法调用
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——RPC -- 本地方法调用:不通过网络 入门 1. RPCObjectProxy rpcObjectProxy = new RPCObjec ...
- JAVA WEB -- request
request request.getContextPath() 返回站点的根目录 request.getRealpath("/")得到的是实际的物理路径,也就是你的项目所在服务 ...
- VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题
一.安装DirectShow. 我装的是DirectShow SDK 9.0b.安装程序名为DXSDK_Jun10.exe. 下载地址:https://pan.baidu.com/s/1kURma3t ...
- 看看大网站都用什么操作系统和Web服务器
以下内容为网络上转载总结,不是很准确 Google 用哪些软件做 Web Server? 除了有两个节点操作系统看出来是 Linux 外,其他的都是未知的. Web 服务器用的都是 GWS ? 我估计 ...
- SQLAlchemy详细教程
http://www.360doc.com/content/15/0914/16/360939_499094891.shtml
- 理解xwindows
大名鼎鼎的 X Window 大家肯定不陌生.都知道它是 Unix/Linux 下面的窗口系统,也都知道它基于 Server/Clinet 架构.在网上随便搜一搜,也可以找到不少 X Window 的 ...
- AngularJS基础02 神奇的数据绑定(Binding)
作者:arccosxy 转载请注明出处:http://www.cnblogs.com/arccosxy/ 上一节,我们在JS中声明一个scope变量然后在HTML直接访问它,这非常的酷.但是Angu ...
- angular.js学习笔记--概念总结
好久没更新了,现在开始学习学习angularjs,并且把学习到的一些知识总结记录一下,方便以后查找以及希望能给初学者一些帮助!(由于本人也是初学ng所以各位慎重理解!) 废话不多说,开始! $root ...
- ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套
这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- Flask web开发之路四
jinjia2模板 模板渲染和参数传递 项目结构如下: 主app文件代码: from flask import Flask,render_template app = Flask(__name__) ...