c#进阶学习day6

1、多线程

进程:一般指程序中运行的程序,实际作用是为程序在执行过程中创建好所需要的环境和资源

线程:是进程的一个实体,是cpu用来调度执行程序的最小单元,一个进程可以拥有多个线程

单线程:进程中只有一个线程,只执行一个线程。

多线程:同一时刻,可以执行多个线程

并发:一段时间内,同时做多件事情

并发是同一时刻,只能执行一个线程,但是多个线程被快速的交替执行,使得在宏观上有了多线程同时执行的假效果,但是在微观上并不是同时执行的,只是把时间分成若干段,使得多个线程快速的交替执行

并行:同一时刻,做多件事儿

指在同一时刻,有多个线程在多个处理器上同时执行,无论从宏观还是微观来看,这些线程都是一起执行的

同步:等待前一个任务结束后,再执行下一个任务,无并发或者并行概念

异步:多个任务,同时执行。并发&并行

Thread th = new Thread();

th.State();通知cpu,准备完成可以随时执行。并不是马上执行。

Thread.Sleep(暂停的时间);阻塞当前线程

th.Join();Join和Sleep一样,都会阻塞当前线程,Join是用线程对象自己来阻塞的。

线程状态控制的方法包括暂停线程 (Sleep)、中断线程 (Interrupt)、挂起线程 (Suspend)、唤醒线程 (Resume)、终止线程 (Abort)。

优先级的值通过 ThreadPriority枚举类型来设置,从低到高分别为Lowest、BelowNormal、Normal、AboveNormal、Highest。

线程的生命周期:出生、就绪、正在执行、暂停、结束

Thread.Sleep(0);交出cpu的调度权限,给更高的优先级

Thread.Sleep(1);交出cpu的调度权限,给任意的优先级

2、多线程异步的三大特征

可见性:当多个线程访问同一个变量时,一个线程修改了这个变量值,其他线程能够立即看到修改后的值

原子性:即一个操作或者多个操作,要么全部执行(执行的过程中不被任何因素打断),要么就都不执行

有序性:即程序的执行按照代码的先后顺序执行。

Private static object o = new object();

Monitor.Enter(o);

执行的语句;

Monitor.Exit(o);//互斥锁

=>

lock(0)

{

    执行的语句;

}

Interlocked.Increment(ref number);

在有锁的情况下执行递增

volatile关键字指示一个字段可以由多个同时执行的线程修改。声明为 volatile的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。

volatile修饰符通常用于由多个线程访问、但不使用lock语句对访问进行序列化的字段。

3、死锁

互斥性:当一个资源被线程使用的时候,别的线程不能使用。

不可抢占性:资源请求者不可强制从资源拥有者中抢夺资源。

占有且等待性:资源请求者在等待其他资源时,保持多原有资源的占有。

循环等待性:线程1等待线程2占有的资源,线程2等待线程1占有的资源。

4、AutoResetEvent和ManualResetEvent

ManualResetEvent表示线程同步事件,事件在一个等待线程释放后收到信号时自动重置

AutoResetEvent表示线程同步事件,收到信号时,必须手动重置该事件。此类不能被继承。

1. WaitOne:

当线程调用WaitOne方法时,它会进入等待状态,直到接收到信号。

如果AutoResetEvent处于无信号状态,WaitOne方法将阻塞线程的执行。

如果AutoResetEvent处于有信号状态,WaitOne方法将消耗该信号,并使AutoResetEvent重新进入无信号状态。

可以通过WaitOne 的重载方法指定超时时间,在超过指定时间后,线程将继续执行而不等待信号。

2.Set:

当线程调用Set方法时,它会将AutoResetEvent 的状态设置为有信号。

如果有线程正在等待信号,它将被唤醒并开始执行。

如果没有线程在等待信号,调用Set方法也会将AutoResetEvent的状态设置为有信号,但不会有任何其他影响。即使多次调用Set方法,AutoResetEvent也只会保持有信号状态一次,直到被消耗。

5、异步编程模型

APM:异步编程模型(Asynchronous Programming Model),这是使用IAsyncResult接口提供异步行为的旧模型。在这种模式下,同步操作需要Begin和End方法(例如,BeginWrite和EndWrite以实现异步写入操作)。

EAP:基于事件的异步编程模式(Event-based Asynchronous Pattern),是提供基于事件的异步行为的旧模型。这种模式需要后缀为Async的方法,以及一个或多个事件、事件处理程序委托类型和EventArg派生类型。

TAP:基于任务的异步编程模式(Task-based Asynchronous Pattern),该模式使用单一方法表示异步操作的开始和完成。

“中级/进阶篇”讲解特点与内容:         本“中级”与“进阶”篇, 是面向初中级游戏研发人员,以及Unity中高级学习者。为了更加深入的刨析各个语法的本质,我们采用反编译解读IL中间语言的方式,来解构语法重点与难点。 中级篇内容主要讲解: .Net 框架、里氏替换原则(LSP)、类的属性极其本质特性、IS ,AS 关键字、字符串的“驻留性” 原理、深入解析Equals() 原理、枚举类型、自定义集合、深入解析动态集合特性与内部原理、泛型集合、泛型约束、初级委托与事件讲解等。 进阶篇是在中级篇的基础之上,进一步研究与讲解关于IO操作、序列化、正则表达式、系统委托(Action、Function、Predicate等)、反射原理与特性、Linq查询表达式、多线程、线程池、任务、Socket套接字编程(Tcp与UDP协议),以及最后使用Unity开发具备实战价值的通讯聊天程序等。C#进阶篇”教学详细说明如下:1: IO操作与序列化      学习文件、目录、二进制文件、文本文件的读取与写入底层原理。学习文件序列化与反序列化技能。2: 正则表达式      学习正则表达式的强大作用与常用原字符的含义与应用场景。3: 深入委托与事件      学习Action、Func、Predicate 系统内置委托类型,已经适用场合。学习匿名方法、Lambda表达式。深入解析委托与事件的区别。4: 反射与特性      学习反射的概念与动态调用的重要应用价值,以及Type、Assembley核心类等,最后讲解“特性”技术。5: Linq 查询表达式     学习Linq 查询表达式对于“对象集合”(支持IEnumberable 或IEnumberable) 以及SQL数据库、XML文档方面的强大查询功能。    6: 多线程     学习多线程以及线程传参、线程取得返回数值技术,前台与后台线程、线程的同步、线程池、任务等技术。   7: Socket套接字通讯     学习Socket套接字通讯中,Tcp与UPD通讯协议的不同应用场景,以及各自的演示示例,最后用Unity开发一款实用性的聊天通讯工具。温习提示:           本C# for Unity 使用Virtual Studio2012,以及Unity5.2 进行开发与讲解。(学员使用更高版本,对学习没有任何影响)。      A:《C# For Unity系列之入门篇》https://edu.csdn.net/course/detail/4560B:《C# For Unity系列之基础篇》https://edu.csdn.net/course/detail/4595C: 《C# For Unity系列之中级篇》https://edu.csdn.net/course/detail/24422
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值