C#中多线程的并行处理
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<int> sourceList = new List<int>();
for (int i = ; i <= ; i++)
{
sourceList.Add(i);
} stopWatch.Reset();
stopWatch.Start();
List<int> resultList = new List<int>();
foreach (int option in sourceList) {
Thread.Sleep();
resultList.Add(option);
}
stopWatch.Stop();
Console.WriteLine("正常运行:" + stopWatch.ElapsedMilliseconds + " ms."); stopWatch.Reset();
stopWatch.Start();
ConcurrentBag<int> concurrentBagList = new ConcurrentBag<int>();
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = ;
Parallel.ForEach(sourceList, options, (item) =>
{
Thread.Sleep();
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 =>
{
.......
});
其他的多线程文章
2. .NET中并行开发优化
3. C# Task.Run 和 Task.Factory.StartNew 区别
4. C#中多线程的并行处理
5. C#中多线程中变量研究
C#中多线程的并行处理的更多相关文章
- C#中多线程中变量研究
今天在知乎上看到一个问题[为什么在同一进程中创建不同线程,但线程各自的变量无法在线程间互相访问?].在多线程中,每个线程都是独立运行的,不同的线程有可能是同一段代码,但不会是同一作用域,所以不会共享. ...
- iOS中多线程知识总结(一)
这一段开发中一直在处理iOS多线程的问题,但是感觉知识太散了,所以就把iOS中多线程的知识点总结了一下. 1.基本概念 1)什么是进程?进程的特性是什么? 进程是指在系统中正在运行的一个应用程序. ...
- C# winform编程中多线程操作控件方法
private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...
- [转] c#中 多线程访问winform控件
原文 c#中多线程访问winform控件的若干问题小结 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的 ...
- iOS 中多线程的简单使用
iOS中常用的多线程操作有( NSThread, NSOperation GCD ) 为了能更直观的展现多线程操作在SB中做如下的界面布局: 当点击下载的时候从网络上下载图片: - (void)loa ...
- Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式
Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...
- java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)
在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...
- [delphi]在DLL中多线程同步Synchronize卡死问题
在dll中多线程同步调用Synchronize不可以,会出现假死卡住的现象.可通过Sendmessage实现. 转网上其他文章解释: Application.Initialize; begin ...
- qt中多线程用法总结
1.多线程的理解 在操作系统中线程和进程划分. 操作系统可以同时执行多个任务,每个任务就是进程:进程可以同时执行多个任务,每个任务就是线程. 线程之间相互独立,抢占式执行.对于单核CPU来说同一时刻只 ...
随机推荐
- oracle第二天笔记
多表查询 /* 多表查询: 笛卡尔积: 实际上是两张表的乘积,但是在实际开发中没有太大意义 格式: select * from 表1,表2 */ select * from emp; select * ...
- linux 内核假死循环导致的问题
[, comm: -IFileSender Tainted: G B ENX -- ZTE Grantley/S1008 [:[<ffffffff810fb2cb>] [<fffff ...
- Java设置运行时环境参数
一.代码中,如下: System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", " ...
- Haskell语言学习笔记(71)Semigroup
Semigroup class Semigroup a where (<>) :: a -> a -> a sconcat :: NonEmpty a -> a stim ...
- Nginx ssl证书部署方法
查看当前安装的OpenSSL版本所支持的密码列表,可以使用下列命令:openssl ciphers 苹果ATS检测:https://www.qcloud.com/product/ssl 刚开始&quo ...
- 【剑指offer】将字符串中的空格替换成"%20"
#include <iostream> #include <string> using namespace std; char *ReplaceSpace(char *str, ...
- SQLServer中利用NTILE函数对数据进行分组的一点使用
本文出处:http://www.cnblogs.com/wy123/p/6908377.html NTILE函数可以按照指定的排序规则,对数据按照指定的组数(M个对象,按照某种排序分N个组)进行分组, ...
- Java复习 之多线程
线程是一个程序中的不同路径 例子1 只有一条路径 每一个分支都是一个线程 实际上在一个时刻内 电脑只能运行一个进程 但是因为cpu运算速度很快 将时间分出来了 所以我们感觉是同时运行 创建线程的两种方 ...
- 网络层——IP报文头介绍
IP数据包也叫IP报文分组,传输在ISO网络7层结构中的网络层,它由IP报文头和IP报文用户数据组成,IP报文头的长度一般在20到60个字节之间,而一个IP分组的最大长度则不能超过65535个字节. ...
- CSS强制换行和禁止换行代码
一.强制换行 1.word-break: break-all; 只对英文起作用,以字母作为换行依据. 2.word-wrap: break-word; 只对英文起作 ...