并发编程
并发就是同时做多件事情,比如:
程序写入数据库的同时响应用户输入
服务器处理第一个请求时响应第二个请求
常用并发编程方式
多线程
异步编程
并行编程
只要你希望程序同时做多件事情,你就需要并发。几乎每个软件程序都会受益于并发。
多线程
进程:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础
线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位
从字面理解,多线程就是使用多个线程来处理
异步编程
异步采用 future 模式或回调(callback)机制,以避免产生不必要的线程
异步编程的关键字
async
Await
两大好处
对于面向终端用户的 GUI 程序:异步编程提高了响应能力。
对于服务器端应用:异步编程实现了可扩展性。服务器应用可以利用线程池满足其可扩展性,使用异步编程后,可扩展性通常可以提高一个数量级。
并行编程
并行编程可以临时提高CPU的利用率,以提高吞吐量
适用场景
- 如果程序中有大量的计算任务,并且这些任务可以分割成几个相互独立的任务块,就可以考虑适用并行编程
- 若客户端系统中的 CPU 经常处于空闲状态,可以考虑使用
- 通常并不适合服务器系统,将降低本身的并行处理能力,并且不会有实际的好处
两种并行形式
- 数据并行
- Parallel.For()
- Parallel.ForEach()
- 任务并行
- Parallel.Invoke()
文件IO
文件系统
文件操作类大都在System.IO命名空间里。FileSystemInfo类是任何文件系统类的基类;FileInfo与File表示文件系统中的文件;DirectoryInfo与Directory表示文件系统中的文件夹;Path表示文件系统中的路径;DriveInfo提供对有关驱动器的信息的访问。注意,XXXInfo与XXX类的区别是:XXX是静态类,XXXInfo类可以实例化
读取文件
读取文件的方式有四种,分别是按照字节读取、读物所有行、按行读取、读取所有文本。
在File类中分别对应 ReadAllBytes、ReadAllLines、ReadLines 、ReadAllText
ReadLines 与 ReadAllLines 方法有如下不同:当使用 ReadLines 时,您可以在返回整个集合之前开始枚举字符串的集合。 使用 ReadAllLines 时,必须等待整个字符串数组返回后才能访问该数组。 因此,在处理非常大的文件时,ReadLines 可能更高效。
写入文件
写入文件的方式与读取的方式对应
在File类中分别对应 WriteAllBytes、WriteAllLines、WriteAllText
流
最常用的流类如下:
FileStream: 文件流,可以读写二进制文件。
StreamReader: 流读取器,使其以一种特定的编码从字节流中读取字符。
StreamWriter: 流写入器,使其以一种特定的编码向流中写入字符。
BufferedStream: 缓冲流,给另一流上的读写操作添加一个缓冲层。
数据流类的层次结构
FileStream类读写
FileStream文件流 只能处理原始字节(raw byte)。FileStream 类可以用于任何数据文件,而不仅仅是文本文件。FileStream 对象可以用于读取诸如图像和声音的文件,FileStream读取出来的是字节数组,然后通过编码转换将字节数组转换成字符串。
网络编程
网络分层模型
网络有两种分层模型,一种是ISO(国际标准化组织)制定的OSI(Open System Interconnect)模型,它将网络分为七层。一种是TCP/IP的四层网络模型。OSI是一种学术上的国际标准,理想概念,TCP/IP是事实上的国际标准,被广泛应用于现实生活中
TCP&UDP协议
Socket编程
Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用,从而实现进程在网络中通信
HTTP协议
HTTP协议,全称Hyper Text Transfer Protocol(超文本传输协议) HTTP协议是用于从服务器传输超文本到本地浏览器的传送协议。 HTTP协议工作于B/S架构上 浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送请求Request。 Web服务器根据接收到的请求后,向客户端发送响应信息Response。 HTTP协议是基于TCP/IP通信协议来传递数据的(HTML 文件, 图片文件等)
HTTP请求过程
请求内容:
响应内容:
C#提供的HTTP编程类
HttpWebRequest:
命名空间: System.Net,这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如
timeouts, cookies, headers, protocols。另一个好处是HttpWebRequest类不会阻塞UI线程。HttpWebRequest通常和WebResponse一起使用,一个发
送请求,一个获取数据。HttpWebRquest更为底层一些,能够对整个访问过程有个直观的认识,但同时也更加复杂一些。
WebClient:
命名空间System.Net,WebClient是一种更高级别的抽象,是HttpWebRequest为了简化最常见任务而创建的,使用过程中你会发现他缺少基本的header,
timeoust的设置,不过这些可以通过继承httpwebrequest来实现。相对来说,WebClient比WebRequest更加简单,它相当于封装了request和response方
法,不过需要说明的是,Webclient和WebRequest继承的是不同类,两者在继承上没有任何关系。使用WebClient可能比HttpWebRequest直接使用更慢
(大约几毫秒),但却更为简单,减少了很多细节,代码量也比较少。
HttpClient:
HttpClient是.NET4.5引入的一个HTTP客户端库,其命名空间为 System.Net.Http ,.NET 4.5之前我们可能使用WebClient和HttpWebRequest来达到相同
目的。HttpClient利用了最新的面向任务模式,使得处理异步请求非常容易。它适合用于多次请求操作,一般设置好默认头部后,可以进行重复多次的请求,
基本上用一个实例可以提交任何的HTTP请求。HttpClient有预热机制,第一次进行访问时比较慢,所以不应该用到HttpClient就new一个出来,应该使用单例或其他方式获取HttpClient的实例。