C# TPL學習(4個程式)

來源:互聯網
上載者:User

標籤:style   http   io   os   使用   ar   for   strong   sp   

程式Ⅰ:通過Task類建立新線程

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace Test000{    class Program    {        /// <summary>        /// Task類封裝        /// </summary>        class MyTask        {            /// <summary>            /// 第一個Task類,每秒計數,計數5次            /// </summary>            public static void T1()            {                Console.WriteLine("Task #{0}: Begin!", Task.CurrentId);                for (int i = 0; i < 5; i++)                {                    Thread.Sleep(1000);                    Console.WriteLine("Task #{0}: {1}", Task.CurrentId, i);                }                Console.WriteLine("Task #{0}: Terminated!", Task.CurrentId);            }            /// <summary>            /// 第二個Task類,每秒計數,計數5次            /// </summary>            public static void T2()            {                Console.WriteLine("Task #{0}: Begin!", Task.CurrentId);                Thread.Sleep(500);                for (int i = 0; i < 5; i++)                {                    Thread.Sleep(1000);                    Console.WriteLine("Task #{0}: {1}", Task.CurrentId, i);                }                Console.WriteLine("Task #{0}: Terminated!", Task.CurrentId);            }        }        static void Main(string[] args)        {            //建立兩個Task            Task tsk1 = new Task(MyTask.T1);            Console.WriteLine("Task #{0}: Constructed!", tsk1.Id);            Task tsk2 = new Task(MyTask.T2);            Console.WriteLine("Task #{0}: Constructed!", tsk1.Id);            //運行Task            tsk1.Start();            tsk2.Start();            //等待Task運行結束            WaitAll(tsk1, tsk2);            Console.ReadLine();        }        /// <summary>        /// 等待所有的Task運行結束        /// </summary>        /// <param name="tsks">等待的Task類</param>        public static void WaitAll(params Task[] tsks)        {            foreach (var t in tsks)            {                t.Wait();            }        }    }}

運行結果

程式Ⅱ:通過TaskFactory啟動任務並接收任務的傳回值

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test001{    class Program    {        /// <summary>        /// Task類封裝        /// </summary>        class MyTask        {            /// <summary>            /// 求1+2+...+n的和            /// </summary>            /// <param name="n">數n</param>            /// <returns></returns>            public static int Sum(object n)            {                int x = (int)n;                int sum = 0;                for (int i = 1; i <= x; i++)                {                    sum += i;                }                return sum;            }        }        static void Main(string[] args)        {            Task<int> tsk = Task<int>.Factory.StartNew(MyTask.Sum, 100);            Console.WriteLine("Result is: " + tsk.Result);            Console.ReadLine();        }    }}

運行結果

程式Ⅲ:通過Parallel類的Invoke函數,並行調用多個Task

本程式中通過Lambda運算式來建立新的Task

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace Test002{    class Program    {        static void Main(string[] args)        {            Parallel.Invoke                (                    () =>                    {                        Console.WriteLine("Task #{0}: Begin!", Task.CurrentId);                        for (int i = 0; i < 5; i++)                        {                            Thread.Sleep(1000);                            Console.WriteLine("Task #{0}: {1}", Task.CurrentId, i);                        }                        Console.WriteLine("Task #{0}: Terminated!", Task.CurrentId);                    },                    () =>                    {                        Console.WriteLine("Task #{0}: Begin!", Task.CurrentId);                        Thread.Sleep(500);                        for (int i = 0; i < 5; i++)                        {                            Thread.Sleep(1000);                            Console.WriteLine("Task #{0}: {1}", Task.CurrentId, i);                        }                        Console.WriteLine("Task #{0}: Terminated!", Task.CurrentId);                    }                );            Console.ReadLine();        }    }}

運行結果

程式Ⅳ:通過Parallel類的For和FoeEach函數,並行調用多個Task

本程式中,通過Stopwatch類統計程式段的已耗用時間

從例中可以看出:不是所有的迴圈在並行化時都是有效。通常,對於小型迴圈或執行非常簡單的操作的迴圈來說,使用順序迴圈比並行迴圈更加快速

using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test003{    class Program    {        /// <summary>        /// 樣本函數        /// </summary>        /// <param name="n">參數</param>        public static void DoSomeThing(int n)        {            int sum = 0;            for (int i = 0; i < n * 100; i++)            {                sum += i;            }        }        static void Main(string[] args)        {            //計時工具,需要System.Diagnostics            Stopwatch sw = new Stopwatch();            //統計依次順序調用函數的時間            sw.Start();            for (int i = 100; i < 105; i++)            {                DoSomeThing(100);            }            sw.Stop();            Console.WriteLine("TotalTime: {0}", sw.Elapsed.TotalMilliseconds);            sw.Reset();            Console.WriteLine("===========");            //統計並行調用函數的時間            sw.Start();            Parallel.For(100, 105, DoSomeThing);            sw.Stop();            Console.WriteLine("TotalTime: {0}", sw.Elapsed.TotalMilliseconds);            sw.Reset();            Console.WriteLine("===========");            //統計並行調用函數的時間            sw.Start();            Parallel.ForEach(new int[5] { 100, 101, 102, 103, 104 }, DoSomeThing);            sw.Stop();            Console.WriteLine("TotalTime: {0}", sw.Elapsed.TotalMilliseconds);            sw.Reset();            Console.ReadLine();        }    }}

運行結果

END

C# TPL學習(4個程式)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.