.net并发编程
一.Parallel实现并行编程
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
ParallelOptions parallelOptions = new ParallelOptions() {
MaxDegreeOfParallelism=16
};
Parallel.ForEach(list, parallelOptions, x => {
//执行具体的任务逻辑
});
Parallel.For(1, 1000, i => {
//使用到i的一些操作
});
Parallel.Invoke(
() => Method1(),
() => Method2(),
() => Method3(),
() => Method4(),
() => Method5()
//需要并行执行的一系列方法
);
注:Parallel支持的并行遍历重载方法还有好几中,这里就不一一列举。
1.如果不对Parallel.ForEach或者Parallel.For指定最大线程数,那么如果任务较多,TPL在初始化5个线程后,每隔100毫秒左右新增线程,直到达到最大线程数。如果新增线程的过程中有任务完成,那么就不会新增线程。
2.如果任务数过多,且不设置最大线程数的话,线程数无法控制,容易造成高CPU,系统失去响应。
推荐书:ParallelProgramming with Microsoft.NET(微软出版社)
3.在任务量不大或者每个任务耗时很短时,则需要考虑是否有必要使用Parallel并行遍历,因为Parallel维护多线程本身需要花费一部分时间,当任务量很小时可能串行速度比用Parallel并行快一些。
二、Task类实现多线程编程
Task.Run(()={
//dowork
})
Task t=Task.Factory.StartNew(()={
//dowork
})
t.Start()
1.使用Task进行并发编程需要采用WaitAll(params Task[] tasks)等所有的Task线程结束,不然可能有子线程没有结束,主线程就已经结束了。