zoukankan      html  css  js  c++  java
  • 多线程---ThreadPool理解(三)

    一、线程池(ThreadPool)

    .NETFramework 2.0。如果某个对象创建和销毁的代价比较高,同时这个对象还可以反复使用,就需要一个线程池。在需要用到的时候直接从线程池里面拿,用完了之后不用销毁,放回线程池里面。

    二、启动线程

                    //开启线程,执行委托,不带参数
                    ThreadPool.QueueUserWorkItem(s => this.Todo("ThreadPoolMethod"));
                    //开启线程,执行委托,带参数
                    ThreadPool.QueueUserWorkItem(s => this.Todo("ThreadPoolMethod"), "小梅");

    三、等待之后,在执行后面的操作

                    ManualResetEvent mre = new ManualResetEvent(false);  //false 关闭
                    ThreadPool.QueueUserWorkItem(s =>
                    {
                        this.Todo("ThreadPoolMethod");
                        mre.Set();  //打开
                    });
                    Console.WriteLine("正在执行中................");
                    Console.WriteLine("正在执行中................");
    
                    Console.WriteLine("正在执行中................");
                    Console.WriteLine("正在执行中................");
    
                    mre.WaitOne();  //等待执行完了之后在玩下执行,会阻塞
    
                    Console.WriteLine("执行完了.........");

    四、回调

            private void ThreadPoolCallBack(WaitCallback waitCallback, Action action)
            {
                ThreadPool.QueueUserWorkItem(s =>
                {
                    waitCallback.Invoke("");
                    action.Invoke();
                }, "");
            }
           Action action = () => this.Todo("ThreadPoolCallBack");
           WaitCallback waitCallback = s =>
           {
               Console.WriteLine("回调函数开始了");
           };
           ThreadPoolCallBack(waitCallback, action);

    五、委托异步方法获取返回值

        private Func<T> ThreadPoolReturn<T>(Func<T> func)
            {
                T t = default(T);
                ManualResetEvent mre = new ManualResetEvent(false);
                ThreadPool.QueueUserWorkItem(s =>
                {
                    t = func.Invoke();
                    mre.Set();
                });
                return new Func<T>(() =>
                {
                    mre.WaitOne();
                    return t;
                });
            }
            Func<int> func = () =>
            {
               return DateTime.Now.Year;
            };
            var threadPoolReturn = ThreadPoolReturn(func);
            int result = threadPoolReturn.Invoke();
            Console.WriteLine(result);
            private void Todo(string name)
            {
                Console.WriteLine($"Todo 方法开始执行....");
    
                long result = 0;
                for (int i = 0; i < 100000; i++)
                {
                    result += i;
                }
                Thread.Sleep(500);
                Console.WriteLine($"Todo方法执行的结果:{result},名称{name},ManagedThreadId:{Thread.CurrentThread.ManagedThreadId}");
    
                Console.WriteLine($"Todo 方法结束执行....");
            }    

     

    将来的你,一定会感谢现在努力的自己!
  • 相关阅读:
    memcached 常用命令最全总结大全
    windows下,java环境变量的设置,设置点击startup.bat启动tomcat
    初步认识消息中间件
    构建自己的Java并发模型框架
    初步理解socket
    Intel Realsense D435 在ROS:Kinetic + Ubuntu16.04中安装使用
    0% [Connecting to security.ubuntu.com (2001:67c:1560:8001::14)]
    realsense D435安装时出现Invoking "cmake" failed,not found ddynamic_reconfigure etc.
    [Halcon] 算子学习_Calibration_Calibration Object
    [Halcon] 使用Halcon生成圆点型标定板
  • 原文地址:https://www.cnblogs.com/GreatPerson/p/14128186.html
Copyright © 2011-2022 走看看