前言

学习这件事情是一个习惯,不能停。。。另外这篇已经看过两个月过去,但觉得有些事情不总结跟没做没啥区别,遂记下此文

1.CLR线程池基础

2.ThreadPool的简单使用练习

3.执行上下文

4.协作式取消和超时,System.Threading.CancellationTokenSource的简单使用

5.任务

6.任务调度器

一、CLR线程池基础

如26章所述,创建和销毁线程是一个昂贵的操作,要耗费大量的时间。另外太多的线程会浪费内存资源。由于操作系统必须调度可运行的线程并执行上下文切换,所以太多的线程还对性能不利。

为了改善这个情况,CLR包含了代码管理它自己的线程池(thread pool),线程池是你的应用程序能使用的线程的集合。

每CLR一个线程池,这个线程池由CLR控制的所有AppDomain共享。

CLR初始化时,线程池中是没有线程的。在内部,线程池维护了一个操作请求队列。应用程序执行一个异步操作时,就调用某个方法,将一个记录项(entry)追加到线程池的队列中,线程池的代码从这个队列中提取记录项,将这个记录项派发(dispatch)给一个线程池线程。如果线程池中没有线程,就创建一个新线程。

如果应用程序向线程池发出许多请求,线程池会尝试只用一个线程来服务所有请求。然而,如果你的应用程序发出请求的速度超过了线程池线程处理它们的速度,就会创建额外的线程。

当一个线程池线程闲着没事一段时间之后,线程会自己醒来终止自己以释放资源。

二、ThreadPool的简单使用练习

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"Main Thread,当前线程:{Thread.CurrentThread.ManagedThreadId}");
            ThreadPool.QueueUserWorkItem(Calculate,5);
            Console.WriteLine($"Main Thread doing other work,当前线程:{Thread.CurrentThread.ManagedThreadId}");
            Thread.Sleep(1000);
            Console.WriteLine("hi <Enter> to end this program~~");
            Console.Read();
        }

        //这个方法的签名必须匹配waitcallback委托
        public static void Calculate(object state)
        {
            //这个方法由一个线程池线程执行
            Console.WriteLine($"In Calculate:state={state},当前线程:{Thread.CurrentThread.ManagedThreadId}");
            Thread.Sleep(1000);
            //这个方法返回后,线程回到池中,等待另一个任务
        }
    }
View Code

相关文章: