• 多线程---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 方法结束执行....");
            }    

     

    将来的你,一定会感谢现在努力的自己!
  • 相关阅读:
    Netty之ProtoBuf(六)
    Netty对WebSocket的支持(五)
    Netty之心跳检测技术(四)
    Netty之多用户的聊天室(三)
    Docker Compose 笔记
    vue.js学习笔记
    powerdesigner 生成C#code 实体 模板设备
    .net 接收post 的参数 加载xml
    powerdesigner 生成实体代码 附加生成xml
    PostgreSql 获取所有的表、视图、字段、 主键
  • 原文地址:https://www.cnblogs.com/GreatPerson/p/14128186.html
Copyright © 2020-2023  润新知