1. 程式人生 > 實用技巧 >多執行緒---ThreadPool理解(三)

多執行緒---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 方法結束執行....");
        }