程序Ⅰ:通过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