浅谈线程池的使用
1、什么是线程池?
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。
2、使用线程池的好处
应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。
3、下面我为大家举一个小的例子来实现线程池的使用:
前台为Winform窗体,创建两个Button按和一个文本框
后台来实现事件:
//线程池Click事件
private void button3_Click(object sender, EventArgs e)
{
//这么写其实只是让线程池启动了一个线程,没有利用多线程来操作
WaitCallback wait = new WaitCallback(DownLoadPool);
ThreadPool.QueueUserWorkItem(wait);
}
//线程池方法
private void DownLoadPool(object obj)
{
for (int i = 30000; i < 30010; i++)
{
try
{
using (WebClient client = new WebClient())
{
client.DownloadFile(@"http://job.cnblogs.com/offer/" + i + "/", @"e:\movie\" + i + ".html");
//使用匿名委托的简写方法
this.Invoke(new Action(delegate()
{
this.textBox1.AppendText("第" + i + "个帖子已经下载");
}));
}
}
catch (Exception ex) { }
}
Action action = new Action(Down);
this.Invoke(action);
}
//多线程池Click事件
private void button4_Click(object sender, EventArgs e)
{
for (int i = 30000; i < 30010; i++)
{
WaitCallback wait = new WaitCallback(DownLoadPool1);
ThreadPool.QueueUserWorkItem(wait, i);
}
}
//多线程池方法
private void DownLoadPool1(object obj)
{
try
{
using (WebClient client = new WebClient())
{
client.DownloadFile(@"http://job.cnblogs.com/offer/" + Convert.ToInt32(obj) + "/", @"e:\movie\" + Convert.ToInt32(obj) + ".html");
//使用匿名委托的简写方法
this.Invoke(new Action(delegate()
{
this.textBox1.AppendText("第" + Convert.ToInt32(obj) + "个帖子已经下载");
}));
}
}
catch (Exception ex) { }
}
4、上面一个简单的小例子就是为了实现线程池的功能,可能上面的例子线程池的耗费有可能会因自己的机子而有所不同的得值
还有使用线程池时还应该注意到的问题,当下面的情况出现时,就不应该在运用线程池来实现效果了
(1)、如果需要使一个任务具有特定优先级
(2)、如果具有可能会长时间运行(并因此阻塞其他任务)的任务
(3)、如果需要将线程放置到单线程单元中(线程池中的线程均处于多线程单元中)
(4)、如果需要永久标识来标识和控制线程,比如想使用专用线程来终止该线程,将其挂起或按名称发现它
System.ThreadingPool类实现了线程池,这是一个静态类,它提供了管理线程的一系列方法
Threading.QueueUserItem方法在线程池中创建一个线程池线程来执行指定方法(用委托WaitCallBack表示),并将该线程排入线程池的队列等待执行。