怎么判断ThreadPool线程池里的任务都执行完毕 怎么判断ThreadPool线程池里的任务都执行完毕?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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.htmlclass 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.htmlpublic 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();} listview如何选中整行! 关于String的问题 请问:dataGridView控件中嵌套的checkbox控件的事件如何添加 @@@@@@@@我就是想修改诸如MessageBox,OpenFileDialog之类的窗体的外观@@@@@@@@@ 用C#编写一个xml文件的读写 关于消息的问题 新手求教如何写撤销与重做的代码 无法确定此文件的编码。请从下面的列表框中选择一种编码 DataGrid控件SelectedIndexChanged事件无法执行(在线等待) C#执行这段代码内存就一直往上飙,求助。 这句格式不正确,怎么改??谢谢各位大手指点 棘手的winform子窗体问题,
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.htmlclass 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.htmlpublic 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();
}