.Net并行编程 - 并行任务基础知识
在微软的.NET Framework中,任务是通过System.Threading.Tasks命令空间中的Task类来实现的。它的静态属性Task.Factory是TaskFactory类的一个实例,它被用来创建和调度新任务。
调度是并行任务的一个重要方面。新任务并不一定会像线程那样直接开始运行,而是被放在一个工作队列里面。
有两个方法,DoLeft()
1 public static void DoLeft() 2 { 3 Thread.Sleep(10000); 4 Console.WriteLine(string.Concat(DateTime.Now.ToLongTimeString(), " DoLeft is running!")); 5 }
和DoRight()
1 public static void DoRight() 2 { 3 Thread.Sleep(2000); 4 Console.WriteLine(string.Concat(DateTime.Now.ToLongTimeString(), " DoRight is running!")); 5 }
我们来并行的执行这两个任务。
• Parallel.Invoke方式
1 static void Main(string[] args) 2 { 3 Stopwatch sw = new Stopwatch(); 4 sw.Start(); 5 6 Parallel.Invoke(DoLeft, DoRight); 7 8 sw.Stop(); 9 Console.WriteLine(string.Format("共计耗时{0}秒", sw.Elapsed.TotalSeconds)); 10 11 Console.Read(); 12 }
运行结果为:
运行结果表明Parallel.Invoke方法创建了新任务并等待它们完成。
• Task.Factory.StartNew方法
调用方法变更为:
1 static void Main(string[] args) 2 { 3 Stopwatch sw = new Stopwatch(); 4 sw.Start(); 5 6 var task1 = Task.Factory.StartNew(DoLeft); //StartNew, 创建并启动System.Threading.Tasks.Task 7 var task2 = Task.Factory.StartNew(DoRight); 8 9 sw.Stop(); 10 Console.WriteLine(string.Format("共计耗时{0}秒", sw.Elapsed.TotalSeconds)); 11 12 Console.Read(); 13 }
运行结果:
从结果可以得出,TaskFactory类的StartNew方法会创建并调度一个新任务,并不等待任务执行完成。添加Task.WaitAll来等待所有并行任务执行完成。
1 Task.WaitAll(task1, task2);
可以看出其是在等待tasks全部执行完成。