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

 

将来的你,一定会感谢现在努力的自己!
原文地址:https://www.cnblogs.com/GreatPerson/p/14128186.html