• 线程池的简单实用


    C# 线程池ThreadPool的用法:

    最近,因为做项目的关系,用到了很多和线程有关的东西。由于以前对线程只是有一个概括的了解,并没有深入的研究过,所以在面对一些问题时,总会感觉到有心无力,为此也花费了大量的时间和精力。为了巩固这方面的知识,特写此文章和大家分享。

    1 最简单的线程例子

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Begin in Main");
            Thread thread = new Thread(new ThreadStart(ThreadInvoke));
            //启动线程
            thread.Start();
    
            //将当前线程挂起200毫秒
            Thread.Sleep(200);
            Console.WriteLine("End in Main");
        }
    
        static void ThreadInvoke()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("Execute in ThreadInvoke");
                //每隔100毫秒,循环一次
                Thread.Sleep(100);
            }
        }
    }
    

     输出结果:

    C# <wbr>线程池ThreadPool的用法

    "End in Main"并没有在ThreadInvoke()方法中所有代码执行完之后才输出。

    由此可见Main方法和ThreadInvoke是并行执行的。

    2 使用线程池
    上面介绍了只是一个最简单的有关线程线程的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,这时,每次都创建线程、启动线程。从性能上来讲,这样做并不理想(因为每使用一个线程就要创建一个,需要占用系统开销);从操作上来讲,每次都要启动,比较麻烦。为此引入的线程池的概念。
    有关线程池的解释请参考:

    http://www.cnblogs.com/JeffreyZhao/archive/2009/07/22/thread-pool-1-the-goal-and-the-clr-thread-pool.html


    把上面的代码修改之后如下:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Begin in Main");
            //Thread thread = new Thread(new ThreadStart(ThreadInvoke));
            ////启动线程
            //thread.Start();
    
            ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadInvoke));
    
            //将当前线程挂起200毫秒
            Thread.Sleep(200);
            Console.WriteLine("End in Main");
    
            Thread.Sleep(3000);
        }
    
        static void ThreadInvoke(Object param)
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("Execute in ThreadInvoke");
                //每隔100毫秒,循环一次
                Thread.Sleep(100);
            }
        }
    }
    

    输出结果:

    C# <wbr>线程池ThreadPool的用法

    上面的代码把线程的创建和启动改为了ThreadPool.QueueUserWorkItem(newWaitCallback(ThreadInvoke)),方法ThreadInvoke加了个参数(Object param),并在Main结束之间加了Thread.Sleep(3000);Thread.Sleep(3000)这句话是必须的因为当Main方法结束后,.Net环境会自动结束销毁线程池,为了保证完成线程池里的任务,所以主线程需要等待一段时间。 

    由输出结果可知,Main方法和ThreadInvoke方法是并行执行的。 

  • 相关阅读:
    c# – 通过反射获取命名空间中的所有类型
    宝塔任务计划通道设置
    DRF项目框架基础设计
    Redis-数据特征和应用场景
    Redis-持久化详解
    Dockerfile文件详解
    ntp同步阿里服务器时间(centos)
    NUC8/11更新EC Firmware
    ambarella H2 kernel调试记录
    MobaXterm 执行make menuconfig不能删除字符
  • 原文地址:https://www.cnblogs.com/a14907/p/5079285.html
Copyright © 2020-2023  润新知