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 判断子线程全部执行完毕的四种方法的更多相关文章

  1. ThreadPool怎样判断子线程全部执行完毕

    原文发布时间为:2010-10-27 -- 来源于本人的百度文章 [由搬家工具导入] 1、先来看看这个 http://hi.baidu.com/handboy/blog/item/160e9697fd ...

  2. 子线程更新UI界面的2种方法

    一.一般我们都会在子线程完成一些耗时的操作. 1.Android中消息机制: 2.知识点: Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队, ...

  3. Android子线程中更新UI的4种方法

    方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...

  4. 老问题:Android子线程中更新UI的3种方法

    在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handle ...

  5. Android 在子线程中更新UI的几种方法

    第一种: new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { // 在这里 ...

  6. Python执行系统命令的四种方法

    一.os.system方法 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态.执行后返回两行结果,第一行是结果, 第二行是执行状态信息,如果命令成功执行,这条语句返回0,否则返回1 ...

  7. Python中执行系统命令的四种方法

    一.os.system方法 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态.执行后返回两行结果,第一行是结果, 第二行是执行状态信息,如果命令成功执行,这条语句返回0,否则返回1 ...

  8. Python—执行系统命令的四种方法

    一.os.system方法 这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息. os.system(cmd)的返回值.如果执行成功,那么会 ...

  9. C#定时检測子线程是否已经完毕

    C#定时检測子线程是否已经完毕 class Program { static void Main(string[] args) { //主线程中启动一个支线程,运行doSomething这种一个方法. ...

随机推荐

  1. [Android] 基于 Linux 命令行构建 Android 应用(四):命令行构建

    谷歌提供的 Android SDK 支持 Ant 自动构建[1],你可以使用调试和发行两种模式进行构建,两种模式不同之处在于调试模式 Ant 会调用内置的调试密钥,而发行模式调用你提供的私钥. 首先安 ...

  2. python 中 打印及格式化字符串的相关方法

    原文 将值转换为字符串 Python 有多种方式将任何值转为字符串: 将它传给 repr() 或 str() 函数. repr() 和 str() 的区别,看几个例子: >>> pr ...

  3. [转] - Spark排错与优化

    Spark排错与优化 http://blog.csdn.net/lsshlsw/article/details/49155087 一. 运维 1. Master挂掉,standby重启也失效 Mast ...

  4. thinkphp 无限极 评论

    郑创 今天用啦一天的时间用了各种方法终于把评论成无限极了,随便评论,有判断自己不能评论自己,下面先说前台源代码! 要实现的视图 前台源代码html模板 <div class="wen_ ...

  5. window.history.go(-1)返回且刷新页面 点击返回上一层

    windows窗口对象(历史)history.go(),history.back(),history.forward(). 因为windows对象引用不是必须的.所以windows.history.g ...

  6. SQL多结果集导出Excel

    由于本项目工作中需要,有时会导出一些数据给客户,但又不是每次都需要,可能这次用了下次可能就不会使用,导出数据,我们正在做的一个项目中与四川地区有关,所以导出数据就有如下需求: 1.  按各市导出数据, ...

  7. 洛谷P1135 奇怪的电梯【bfs】

    题目:https://www.luogu.org/problemnew/show/P1135 题意: 一共有n层楼,在第i层可以往上或往下$k_i$层. 问从$a$层到$b$层至少需要多少乘多少次电梯 ...

  8. 查看dsym的报错信息(友盟)

    //搜索显示报错信息的命令在终端直接运行(来源老版提示) export dSYMPath="$(find ~/Library/Developer/Xcode -iname '*.dSYM' ...

  9. 如何写好.babelrc?Babel的presets和plugins配置解析

    什么是Babel The compiler for writing next generation JavaScript. 官网是这么说的,翻译一下就是下一代JavaScript 语法的编译器. 作为 ...

  10. iOS 抽取app中的图片图标资源

    iTunes 12.6之前的版本,我们手机连上MAC之后,可以在iTunes里看到应用选项,但是12.8之后的版本就不行了.无法通过iTunes 获取ipa文件进而获取APP图片资源. 不过还是有其他 ...