C#中使用Parallel类来进行多线程并发编程
在新西兰工作时,有一次的面试中问到了Parallel类进行多线程编程
我们知道,C#中实现多线程编程有多种方式,包括
1. 使用Thread开启一个新的线程
2. 使用Parallel类
3. 使用Task
我们今天来说一下C#中的Parallel类,Parallel类是C#中可以用来进行多线程编程的一个类,它让我们可以像写传统代码一样来编写C#中的多线程程序,它有3个比较常用的方法:
Parallel.For() => 开启多线程来循环执行一段代码
Parallel.ForEach() => 开启多线程遍历处理一个对象集合
Parallel.Invoke() => 开启多线程执行多个方法
好,接下来,我们来看一个使用Parallel.For()的例子
public void ParallelForTest() {
Parallel.For(1,10,i => {
Console.WriteLine(string.Format("i = {0}", i));
}); }
这段代码很容易理解,循环输出1到10. 你是不是以为输出会是这样:
i = 1 i = 2 i = 3 i = 4 i = 5 i = 6 i = 7 i = 8 i = 9
如果是个for循环,那肯定是这样的,因为for循环是个单线程,就是按照顺序来一个一个输出
而这里,Parallel.For => 采用的是多线程,也就是说输出 i =1时可能在线程1上执行,输出 i = 2时可能在线程5上执行 , 输出 i = 3时可能又在线程1上了,它没法保证是按照顺序来输出1,2,3,4,....所以它输出结果是乱序的,它的结果如下
i = 1 i = 5 i = 3 i = 4 i = 7 i = 9 i = 2 i = 6 i = 8
接下来我们看看ParallelForEach的使用
public void parallelForEachTest() {
//构造泛型集合数据 List<User> userList = new List<User> { new User{ UserId=1,UserName="张三" }, new User{ UserId=2,UserName="李四" }, new User{ UserId=3,UserName="王五" }, new User{ UserId=4,UserName="赵六" }, new User{ UserId=5,UserName="大师兄" } };
//Parallel.ForEach 计算循环时间 string testName = string.Empty; Stopwatch sw = new Stopwatch(); sw.Start(); //计时开始 Parallel.ForEach(userList, u => //多线程遍历 { testName += u.UserName + ","; Thread.Sleep(10);//模拟一个耗时操作,以免看不到效果 }); sw.Stop(); //计时结束
}
关于Parallel.Invoke() 具体可以自己查阅相关资料