博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中多线程的并行处理
阅读量:4477 次
发布时间:2019-06-08

本文共 2074 字,大约阅读时间需要 6 分钟。

System.Threading.Tasks,在该命名空间下Task是主类,表示一个类的异步的并发的操作,创建并行代码的时候不一定要直接使用Task类,在某些情况下可以直接使用Parallel静态类(System.Threading.Tasks.Parallel)下所提供的方法进行并行开发,而不用底层的Task实例。

并行处理无法保证顺序,不需要考虑任务和线程的问题,执行效率加快,当然也不是绝对的,任务的开销大小对并行任务有影响,如果任务很小,那么由于并行管理的附加开销(任务分配,调度,同步等成本),可能并行执行并不是优化方案。例如:循环打印10000个数字,for的循环比Parallel.For快

Parallel 类的使用(System.Threading.Tasks)

提供对并行循环和区域的支持。在Parallel下面有三个常用的方法invoke,For和ForEach。

Stopwatch stopWatch = new Stopwatch();List
sourceList = new List
();for (int i = 0; i <= 10000; i++){ sourceList.Add(i);}stopWatch.Reset();stopWatch.Start();List
resultList = new List
();foreach (int option in sourceList) { Thread.Sleep(1); resultList.Add(option);}stopWatch.Stop();Console.WriteLine("正常运行:" + stopWatch.ElapsedMilliseconds + " ms.");stopWatch.Reset();stopWatch.Start();ConcurrentBag
concurrentBagList = new ConcurrentBag
();ParallelOptions options = new ParallelOptions();options.MaxDegreeOfParallelism = 4;Parallel.ForEach(sourceList, options, (item) =>{ Thread.Sleep(1); concurrentBagList.Add(item);});stopWatch.Stop();Console.WriteLine("并行运行:" + stopWatch.ElapsedMilliseconds + " ms.");

上面的例子,如果把Thread.Sleep(1),去掉可以发现,foreach比Parallel.ForEach快,所以任务的开销很重要。ConcurrentBag如果换成List可以发现,list中的数据不够。List集合,数组Int[],String[] ……,Dictory字典等等。但是这些列表、集合和数组的线程都不是安全的,不能接受并发请求。微软也提供了线程安全的类Concurrent

Concurrent类(System.Collections)

命名空间提供多个线程安全集合类。当有多个线程并发访问集合时,应使用这些类代替 System.Collections 和 System.Collections.Generic 命名空间中的对应类型。

BlockingCollection<T> 为实现 IProducerConsumerCollection<T> 的线程安全集合提供阻塞和限制功能。

ConcurrentBag<T> 表示对象的线程安全的无序集合。可以用来替换List<T>
ConcurrentDictionary<TKey, TValue> 表示可由多个线程同时访问的键值对的线程安全集合。Dictionary<TKey, TValue>
ConcurrentQueue<T> 表示线程安全的先进先出 (FIFO) 集合。Queue<T>
ConcurrentStack<T> 表示线程安全的后进先出 (LIFO) 集合。Stack<T>

NuGet中AsyncEnumerator

并行中的多线程

await list.ParallelForEachAsync(async l =>            {.......            });

 

其他的多线程文章

1. 

2. .

3. 

4. 

5. 

转载于:https://www.cnblogs.com/zhao123/p/9293599.html

你可能感兴趣的文章
[CareerCup] 3.6 Sort Stack 栈排序
查看>>
Beta版总结会议
查看>>
Cocos2d-x中使用的数据容器类
查看>>
创建ORACLE 查询用户
查看>>
jzoj3297. 【SDOI2013】逃考
查看>>
通过例子学python(2.1)
查看>>
高效率场景-内存映射
查看>>
Python基础——0前言
查看>>
机器学习三剑客之Numpy
查看>>
django路由转发
查看>>
HBase环境搭建随笔
查看>>
SAX vs. DOM (Event vs. Tree)
查看>>
堆排序原理及算法实现(最大堆)
查看>>
说说无线路由器后门的那些事儿(1)-D-Link篇
查看>>
AJAX POST&跨域 解决方案 - CORS
查看>>
C#基础之接口
查看>>
nio 序列化
查看>>
Hadoop集群时钟同步
查看>>
C++二维数组讲解、二维数组的声明和初始化
查看>>
纹理映射和混合
查看>>