標籤: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個程式)