引入名称空间
using System.Threading.Tasks;
英文直译平行,就是并行计算,同一时间一起计算,执行顺序是乱的。里面都是静态方法,Parallel 主要提供了 For 系列方法和 ForEach 系列方法,并行处理所有项。两个系列的方法都有若干重载,但最常用也最易用的是这两个。
For
//Parallel里面这个方法,用法和普通的for循环一样,从fromInclusive开始,到toExclusive结束(fromInclusive < toExclusive)。每次迭代都执行body委托函数
public static ParallelLoopResult For(int fromInclusive, int toExclusive, Action<int> body);
Parallel.For(0, 10, (i) =>
{
Console.Write(i + " ");
});
//打印结果,随机的:4 5 8 6 1 2 7 0 3 9
Foreach
var all = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Parallel.ForEach(all, (i) => {
Console.Write($"{i} ");
});
//打印结果
//5 7 3 2 1 9 0 8 4 6
Invoke
同时执行多个任务
static void Main(string[] args)
{
Parallel.Invoke(A,B,C,D);
}
static void A()
{
Thread.Sleep(1000);
Console.WriteLine("A");
}
static void B()
{
Thread.Sleep(1000);
Console.WriteLine("B");
}
static void C()
{
Thread.Sleep(1000);
Console.WriteLine("C");
}
static void D()
{
Thread.Sleep(1000);
Console.WriteLine("D");
}
线程安全资源锁定机制Interlocked
如果在Parallel.For内部执行++,+=操作,会出现bug。因为不是原子操作。用下面的写法,执行原子操作。
int sum = 0;
Parallel.For(0,10, n => {
Console.Write($"{n} ");
Interlocked.Add(ref sum, 1);
});
Console.WriteLine(sum);
并行的意义在于处理耗时计算
Parallel的For和Foreach 对比传统的for 和 foreach。就是异步,并行。能用多线程处理任务,节省时间。
举个例子,一个工程交给一个人做,需要100天,若是交给10个人同时做,虽然不可能10天完成,可能15-30天就完成了,比100天快多了。
static void Main(string[] args)
{
DateTime s = DateTime.Now;
for(int i = 0; i < 10;i++)
{
A();
}
DateTime e = DateTime.Now;
Console.WriteLine($"用时{(e - s).TotalMilliseconds}毫秒");
}
static void A()
{
Thread.Sleep(1000);
}
//打印结果
//用时10095.4379毫秒
static void Main(string[] args)
{
DateTime s = DateTime.Now;
Parallel.For(0, 10, (i) =>
{
A();
});
DateTime e = DateTime.Now;
Console.WriteLine($"用时{(e - s).TotalMilliseconds}毫秒");
}
static void A()
{
Thread.Sleep(1000);
}
//用时2039.6993毫秒
对于耗费时间的操作,Parallel的操作显而易见效率更高。