使用线程池
由于线程的创建和销毁需要非常大的性能开销,在 WindowsNT 内核的操作系统上,每个进程都会包含一个线程池。线程池由 CLR 管理。
.NET 提供 System.Threading.ThreadPool
类型来提供关于线程池的操作。
常用的有下面 3 个静态方法:
public static bool QueueUserWorkItem;
public static bool QueueUserWorkItem;
public static bool UnsafeQueueUserWorkItem;
示例代码
点击查看代码
csharp
using System;
using System.Threading;
namespace ThreadPoolSample
{
class Program
{
static void Main(string args)
{
string taskinfo = "运行 10 秒";
// 插入一个新的请求到线程池
bool result = ThreadPool.QueueUserWorkItem(DoWork, taskinfo);
// 分配线程有可能失败
if (!result)
{
Console.WriteLine("分配线程失败");
}
else
{
Console.WriteLine("按回车可结束线程");
}
Console.Read();
}
/// <summary>
/// 线程的方法
/// 必须符合 WaitCallback 委托的声明
/// </summary>
/// <param name="state"></param>
private static void DoWork(object state)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("工作者线程的任务是:{0}", state.ToString());
Thread.Sleep(1000);
}
}
}
}
输出结果
点击查看输出结果
按回车可结束线程
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
如果在程序运行过程中按下回车键,程序会立即中止。
这说明主线程和插入的工作者线程完全并行,并且线程池中的线程是后台线程的特性。
总结
System.Threading.ThreadPool
类型封装了线程池的操作。每个进程都拥有一个线程池,.NET 提供了线程池的管理机制,用户只需要把线程需求插入到线程池中,而不必再理会后续的工作。
所有线程池中的线程都是后台线程,它们不会阻碍程序的退出。