1. 程式人生 > >Thread(線程)三

Thread(線程)三

toa mage name 事件 turn *** line 其他 edt

今天我們繼續接著線程講講,上一章提到一下task概念,

首先接著task繼續往下講,在前章節提到過Thread怎麽實現其他線程完成後再讓主線程繼續執行的功能,那麽如果Task也需要線程等待事件,該怎麽實現呢?

在這裏介紹四種方法。

1、ContinueWhenAny方法

              taskFactory.ContinueWhenAny(taskList.ToArray(), t =>
                {
                   //t.AsyncState
                 Console.WriteLine("這裏是ContinueWhenAny {0}", Thread.CurrentThread.ManagedThreadId);
                });

這種做法是在等task對象list集合中的任何一個線程完成後執行回調函數。

技術分享

2、ContinueWhenAll方法

            taskFactory.ContinueWhenAll(taskList.ToArray(), tList =>
             {
                 Console.WriteLine("這裏是ContinueWhenAll {0}", Thread.CurrentThread.ManagedThreadId);
           });

這種是等list集合全部完成後在執行,在執行回調函數

技術分享

3、WaitAny方法

            Task.WaitAny(taskList.ToArray());//執行的線程等待某一個task的完成
            Console.WriteLine("after WaitAny{0}", Thread.CurrentThread.ManagedThreadId);

技術分享

只要等待其中任何一個線程完成,就會繼續後面的程序代碼。

4、WaitAll方法

            Task.WaitAll(taskList.ToArray());//執行的線程等待全部的task的完成
            Console.WriteLine("after WaitAll{0}", Thread.CurrentThread.ManagedThreadId);

 技術分享

等待多有線程完成後再去執行後面程序代碼。

一般來說有這四種方法,可以解決等待事件的所有需求,如果不能實現,那有可能是程序設計上有些問題了。

***********************************************************************************************************************************************

Parallel:這個是.net後面提出的概念

Parallel.Invoke(() => this.TestThread("btnParallel_Click_0")
                        , () => this.TestThread("btnParallel_Click_1")
                       , () => this.TestThread("btnParallel_Click_2")
                         , () => this.TestThread("btnParallel_Click_3")
                         , () => this.TestThread("btnParallel_Click_4"));


            //等於使用4個task,然後主線程同步invoke一個委托  然後主線程waitall

  技術分享

這種做法就是讓主線程也參與在計算中,充分利用資源吧。

            Parallel.For(6, 10, t =>
            {
                string name = string.Format("For btnParallel_Click_{0}", t);
                this.TestThread(name);
            });

            Parallel.ForEach(new int[] { 5, 6, 7, 10, 8473847 }, t =>
            {
                string name = string.Format("ForEach btnParallel_Click_{0}", t);
                this.TestThread(name);
            });

            ParallelOptions parallelOptions = new ParallelOptions()
            {
                MaxDegreeOfParallelism = 5//相當於設置一個最大的線程數
            };
            Parallel.For(6, 15, (t, state) =>
                        {
                            string name = string.Format("btnParallel_Click_{0}", t);
                            this.TestThread(name);
                            Console.WriteLine(state);
                            state.Break();//退出單次循環
                            state.Stop();//退出全部的循環
                            return;
                        });

  

Thread(線程)三