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。