Parallel类是.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。