线程使用
//获取当前线程
Thread t = Thread.CurrentThread;
Console.WriteLine(t.Name)
//开启线程
Thread childThread = new Thread(new ThreadStart(要执行的方法【不加()调用】))
childThread。Start();
异步线程例子
public static void AsyncTask()
{
//创建多线程列表(用来存放多个线程)
List<Task> TaskList = new List<Task>();
// 创建线程委托
TaskFactory taskFactory = Task.Factory;
for (var i = 0; i< 3; i++)
{
//通过委托创建一个线程去执行
Task tf = taskFactory.StartNew(() => {
for (var j = 0; j < 10; j++)
{
//线程等待1s
Thread.Sleep(1000);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() + ":" + j.ToString());
}
});
//将线程添加进线程list
TaskList.Add(tf);
}
//等待list中的所有线程结束。
Task.WaitAll(TaskList.ToArray());
}
线程池
定义
线程池其实是一个线程队列,只是创建跟开启不需要你管,C#已经帮你封装好了。
该列表由通过ThreadPool类托管,这个类会在需要时增减池中线程的线程数,直到最大的线程数, 池中的最大线程数是可配置的。在双核CPU中,默认设置为1023个工作线程和1000个I/O线程。 也可以指定在创建线程池时应立即启动的最小线程数,以及线程池中可用的最大线程数。如果有 更多的作业要处理,线程池中线程的个数也到了极限,最新的作业就需要排队,且必须等待线程 完成其他任务。
例子
public static void poolTask()
{
for (var i = 0; i < 10; i++)
{
//通过ThreadPool.QueueUserWorkItem()将任务添加到线程池中
//两个参数
//1. new WaitCallback()实例对象
//2. 将 i 以Object类型传入ProcessFile
ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessFile), i);
}
}
public static void ProcessFile(Object e)
{
for (var i = 0; i < 10; i++)
{
Thread.Sleep(1000);
Console.WriteLine(i);
}
}
开启线程池最大数量
线程池最多管理线程数量=“处理器数 * 250”。也就是说,如果您的机器为2个2核CPU, 那么CLR线程池的容量默认上限便是1000
通过线程池创建的线程默认为后台线程,优先级默认为Normal。
在什么情况下使用线程池
1.单个任务处理的时间比较短 ,一直检测的任务并不适合假如线程池, 应该是用Thread类创建一个新的线程。
2.需要处理的任务的数量大