昨天在部门分享.net多线程的一些内容,特此在博客记录下。内容如下:

进程与线程

1.什么是进程

进程是指在系统中正在运行的一个应用程序
每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内

2.什么是线程

1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)
线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行

3.线程的串行

1个线程中任务的执行是串行的
如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务
也就是说,在同一时间内,1个线程只能执行1个任务

4.什么是多线程

1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务

并发与并行

并发(concurrency):
在同一时刻只能有一条指令执行,
多个线程程指令被快速的轮换执行

并行(parallel):
在同一时刻,有多条指令
在多个处理器上同时执行。

ps:(上面中的两个小图,来自网上,如有侵权,请联系本人删除)

多线程的原理与优缺点

同一时间,单CPU只能处理1条线程,只有1条线程在工作(执行)多线程并发(同时)执行,
其实是CPU快速地在多条线程之间调度(切换)如果CPU调度线程的时间足够快,就造成了多线程并行执行的假象
优点
1、能适当提高程序的执行效率
2、能适当提高资源利用率(CPU、内存、带宽)

缺点
1、开启线程需要占用一定的内存空间
    (默认情况下,主线程占用1M,子线程占用512KB)
2、CPU在调度线程上的开销就越大(上下文切换)
3、并发线程数过高可能出现大量的IO阻塞

如果串行算法可以在不到1S内就能得出结果,那么切换到并行的加速效果不明显
目前没有很好的判断标准,最好的方式就是不停的测试

线程上下文切换,CPU暂停程序执行,将当前寄存器的值保存到内存中,从现有线程中选出一个线程加载上下文结构到寄存器,再开始执行。
Windows大约每30ms执行一次垃圾回收,CLR会暂停所有的线程,遍历所有的对象进行垃圾清除。

线程安全的集合

System.Collections.Concurrent命名空间下的类型来用于并行循环体内。

说明

BlockingCollection<T>

为实现 IProducerConsumerCollection<T> 的线程安全

集合提供阻止和限制功能。

ConcurrentBag<T>

表示对象的线程安全的无序集合。

ConcurrentDictionary<TKey, TValue>

表示可由多个线程同时访问的键值对的线程安全集合。

ConcurrentQueue<T>

表示线程安全的先进先出 (FIFO) 集合。

ConcurrentStack<T>

表示线程安全的后进先出 (LIFO) 集合。

OrderablePartitioner<TSource>

表示将一个可排序数据源拆分成多个分区的特定方式。

Partitioner

提供针对数组、列表和可枚举项的常见分区策略。

Partitioner<TSource>

表示将一个数据源拆分成多个分区的特定方式。

线程状态

成员名称

说明

Aborted

线程处于 Stopped 状态中。

AbortRequested

已对线程调用了 Thread.Abort 方法,但线程尚未收到试图终止它的挂起的System.Threading.ThreadAbortException。

Background

线程正作为后台线程执行(相对于前台线程而言)。此状态可以通过设置Thread.IsBackground 属性来控制。

Running

线程已启动,它未被阻塞,并且没有挂起的 ThreadAbortException。

Stopped

线程已停止。

StopRequested

正在请求线程停止。这仅用于内部。

Suspended

线程已挂起。

SuspendRequested

正在请求线程挂起。

Unstarted

尚未对线程调用 Thread.Start 方法。

WaitSleepJoin

由于调用 Wait、Sleep 或 Join,线程已被阻止。

C#多线程环境下调用 HttpWebRequest 并发连接限制

.net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统windows 7 下默认是2,在服务器操作系统上默认为10。不修改这个并发连接限制,客户端同时可以建立的 http 连接数就只有2个或10个。

经过验证,在.net core下也是如此。

.net cor中源码地址:https://github.com/dotnet/corefx/blob/master/src/System.Net.Requests/src/System/Net/HttpWebRequest.cs

对应的.net freamwork中的代码:

之所以有这个并发连接限制,是因为 http 1.0 和 http 1.1 标准规定并发连接数最大为2.。不过目前主流的浏览器都已经不遵循这个规则了,但 .net 依然默认遵循这个规则。

对于.net core,这个设置系统级别的,不过没读注册表。。。对了,linux没注册表。当应该读系统的环境变量才行的。(作者未验证,欢迎验证过的同学评论)

解决办法:

System.Net.ServicePointManager.DefaultConnectionLimit = ;  //第一种
//HttpWebRequest.ServicePoint.ConnectionLimit=512; //第二种

.net freawork 下,也可以在配置文件app.config中设置:

<system.net>
<defaultProxy enabled="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy> <connectionManagement>
<add address="*" maxconnection="10"/>
</connectionManagement> </system.net>

另外提一点:HttpWebRequest默认会使用IE代理设置,上面的配置文件设置不启用代理。

还有一种方法 httpWebRequest.Proxy = null;

这样可以减少.net使用代理所需要花费的时间和占用的资源。

Demo

针对上述理论,我写了Thread 、 Task  、Parallel 的各种demo ,以及多线程的取消的Demo。由于篇幅有限,就在此不做展示,源代码地址:

https://github.com/li-shaoke/ThreadDemo

参考自:

https://www.cnblogs.com/summer_adai/archive/2013/04/26/3045274.html

https://www.cnblogs.com/huangxincheng/archive/2012/04/03/2430638.html

.net多线程应用的更多相关文章

  1. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  2. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  3. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  4. Java多线程

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程.   进程:进程 ...

  5. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  6. Java多线程基础——对象及变量并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

  7. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  8. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  9. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  10. C#多线程之线程同步篇3

    在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...

随机推荐

  1. centos 下安装jdk、tomcat 以及tomcat无法从外部访问的解决办法

    centos 下安装jdk.tomcat 以及tomcat无法从外部访问的解决办法 原创 2014年08月28日 10:24:33 标签: selinux enforce cent 2223 昨天在c ...

  2. Python pip 下载速度慢? Windows 设置 国内源,用 阿里云 国内镜像 加速

    pip 提供了对 Python 包的查找.下载.安装.卸载的功能,是非常方便的 Python 包管理工具.但是,令人苦恼的是 pip 在国内的下载速度非常慢,速度常常只有每秒几十 K,甚至才几 K,小 ...

  3. css3 滚动条出现 页面不跳动

    .wrap-outer { margin-left: calc(100vw - 100%); }   .wrap-outer { padding-left: calc(100vw - 100%); } ...

  4. Spring+Spring MVC+MyBatis框架集成

    目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六.JUnit测试数据访问 七.完成Spring整合My ...

  5. 对比MFC和Winform及WPF

    MFC 生成本机代码,自然是很快.可是,消息循环,减缓了界面显示速度.winform 封装了 win32 的api,多次进行P/invoke 操作 (大部分使用p/invoke操作封装),速度慢 .w ...

  6. 在foreach的判断条件里执行方法会有效率问题吗?

    楼猪平时一有空就有看别人代码的习惯,从许多优秀规范的代码中学习到了很多简约高效的写法和画龙点睛的思想精华.但是有的时候也会觉得某些写法很值得玩味.比如刚看到一段代码,在foreach的条件判断里加了一 ...

  7. gcc调试 学习1

    gdb进入调试 b 6 在第6行设置断点 d 2 删除num为2的断点 info b 查看断点 run 运行 n 执行到断点1 s 如果下一条是函数就进入函数 n 继续执行 print i  输出i的 ...

  8. Linux下安装ActiveMQ CPP

    ActiveMQ CPP ActiveMQ CPP是用C++语言访问ActiveMQ的客户端开发库,也称cms(cpp message service),安装cms开发库需要先安装一些基础库. 如下: ...

  9. Fis3迁移至Webpack实战

    Webpack从2015年9月第一个版本横空初始至今已逾2载.它的出现,颠覆了一大批主流构建如Ant.Grunt和Gulp等等.腾讯NOW直播IVWEB团队之前一直采用Fis构建,本篇文章主要介绍从F ...

  10. WebService学习总结

    因为最近开发的项目需求中涉及到了webservice,正好对这块知识以前学过但是又忘记了,于是想着从新学习下,整理一个笔记,便于后面的复习.于是有了本文,下面开始介绍webservice. 一.简介 ...