2017-03-16
3023 0Parallel类是.NET 4中新增的抽象线程类。Parallel.For()方法类似于C#的for循环语句,也是多次执行一个任务。但是使用Parallel.For()方法,可以并行运行。
对于Parallel.For、Parallel.Foreach的使用应该要特别小心,它们的优势是处理列表很长,且对列表内的元素进行很复杂的业务逻辑,且不会使用共享资源,只针对自身的业务逻辑处理,方才能提升效率。
如果逻辑过于简单的话,创建线程的花费将大于业务执行的花费,此时不建议使用Parallel。
Parallel.For和Parallel.ForEach都会在执行完所有循环后再执行后面的代码。
下面给出了一个例子,用来体现Parallel.For和普通For的区别:
static void Main(string[] args) { Console.WriteLine("Parallel.For"); T1(); Console.WriteLine("普通For"); T2(); Console.ReadLine(); } static void T1() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); Parallel.For(0, 50, i => { Stopwatch sw = new Stopwatch(); sw.Start(); using (WebClient wc = new WebClient()) { var aa = wc.DownloadString("http://www.leavescn.com/Articles/Content/" + i + "?rnd=" + Guid.NewGuid()); sw.Stop(); Console.Write(string.Format("[{0}-耗时{1}]", i, sw.ElapsedMilliseconds)); } }); stopwatch.Stop(); Console.WriteLine("\nEnd-执行时间:" + stopwatch.ElapsedMilliseconds); } static void T2() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for(int i=0;i<50; i++) { Stopwatch sw = new Stopwatch(); sw.Start(); using (WebClient wc = new WebClient()) { var aa = wc.DownloadString("http://www.leavescn.com/Articles/Content/" + i + "?rnd=" + Guid.NewGuid()); sw.Stop(); Console.Write(string.Format("[{0}-耗时{1}]", i, sw.ElapsedMilliseconds)); } }; stopwatch.Stop(); Console.WriteLine("\nEnd-执行时间:" + stopwatch.ElapsedMilliseconds); }
执行结果如下:
可以看到,Parallel.For和普通For都是在执行完循环体内的代码再执行后面的代码。
在执行50次下载任务时,使用Parallel.For的话,执行时间少了1s。