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() 具体可以自己查阅相关资料

posted on 2024-04-17 10:34  新西兰程序员  阅读(403)  评论(0编辑  收藏  举报