随笔分类 -  读书笔记

CLR via C# 读书笔记 5-1 何时对托管资源使用Finalize
摘要:Finalize方法常用于回收非托管资源,以防止资源泄露在较少的情况下它也会被用于托管资源1.构造函数中如果抛出异常, 那么只有Finalize方法才会被执行,在这里可以回收一些已经分配的资源(Dispose不会被执行!!!)当然:Finalize方法的执行时间还是下一次GC的时候(依然不确定时间)如果不实现该方法将会造成资源泄露以下代码演示了在这种情况代码所以一般情况下为了完全避免资源泄露例如Memory leak, 通常将类实现为以下的方式代码 阅读全文

posted @ 2010-12-06 11:37 听说读写 阅读(447) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 4-2 线程和锁的一些使用原则
摘要:1.如果可以,尽可能使用线程池中的线程, 因为自己创建,维护销毁一个线程会极大的消耗CPU和内存资源,如果需要定时工作,那么请使用System.Threading.Timer2.在读多写少的情况,使用读写锁ReaderWriterLockSlim (不要使用ReaderWriterLock), 因为这样读操作之间不会互斥3.尽量不要使用递归的锁 ,当然Moniter是个例外,他虽然使用了递归, 但... 阅读全文

posted @ 2010-12-02 10:58 听说读写 阅读(471) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 4-1 线程同步-常见的锁,原生用户模式和核心模式 (上)
摘要:本文主要描述为了保证线程同步和数据安全采用的若干种不同方案以锁为例:1.用户模式(User-Mode)比核心模式(Kernel-Mode)快很多2.windows操作系统无法发现用户模式的锁 (即使已经被Blocked了) ,所以线程池也不会为此新建一个线程处理新的请求3.核心模式的锁可以使得线程停止运行, 这样就不会浪费CPU,只是浪费内存(条件满足的时候,windows会唤醒之前休眠的线程继续... 阅读全文

posted @ 2010-12-01 11:30 听说读写 阅读(418) 评论(0) 推荐(0) 编辑

net异步操作总结和比较
摘要:以下是个人理解:Compute 主要指的是CPU密集型或者是其他计算密集型的操作I/O 这里指的是操作文件或者网络等适用的异步情况父子依赖指的是 一个任务是不是依赖于其他任务的状态而执行(例如A任务完成取消或者异常的时候 B任务执行)取消: 一个任务开始以后是否能够被终止等待:能否block住当前线程以等待异步操作的完成(是否有内置功能支持)超时:能否对异步任务设置超时时间返回值和异常:能否处理异步任务的返回值和异常(是否有内置功能支持)异步方式主要应用Emulate Secondaryvia What?父子依赖关系进度报告取消等待超时返回值和异常QueueUserWorkItemComput 阅读全文

posted @ 2010-11-30 13:51 听说读写 阅读(648) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 3-6 比较APM和EAP(异步编程模型和基于事件的编程模式)
摘要:APM: The Asynchronous Programming Model (异步编程模型) BeginXXXEAP: The Event-Base Asynchronous Pattern (基于事件的编程模式) Button.Click+=........EPM: The Event-Base Programming Model 1.本质上EAP内部也是使用了APM,只是EAP做了一些封装... 阅读全文

posted @ 2010-11-30 12:47 听说读写 阅读(850) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 2-3 Cache Lines and False Sharing(高速缓冲区和错误共享???)
摘要:因为水平有限 不知道怎么用中文表达Cache Lines 和 False Sharing (暂时把他们翻译为 高速缓冲区和错误共享,如有谬误,还请有识之士指正)现在的cpu 一般拥有多个核心和一个cpu内的缓存(一般是L2?)这些缓存一般位于cpu芯片内, 他的速度远远高于主板上的内存,一般来说cpu会把数据从内存加载到缓存中 ,这样可以获得更好的性能(特别是频繁使用的数据)这个高速缓存默认划分... 阅读全文

posted @ 2010-11-25 12:10 听说读写 阅读(1468) 评论(1) 推荐(1) 编辑

CLR via C# 读书笔记 2-2 编译器优化导致的问题 - Timer
摘要:DotNet项目在Debug 和Release 模式一个主要的差别就是有没有打开编译器优化在Release下由于采用了编辑器优化,那么原来有些运行正常的代码就会出问题下列代码, 系统觉得Timer已经没有用了...所以就被回收了..所以在Release模式下 timer只会执行一次 (注意如果是Debug模式那么一直运行)(注意如果使用Visual Studio的调试器, vs会帮你延长临时变量的... 阅读全文

posted @ 2010-11-24 14:50 听说读写 阅读(416) 评论(1) 推荐(1) 编辑

CLR via C# 读书笔记 3-5 .net framework4.0 新增类 Task(一种很好的异步模型)
摘要:Task 是在.net framework 4.0中提供的新功能主要用于异步操作的控制在很多时候他比Thread和ThreadPool提供更为强大的功能,并且更方便使用1.demo以下代码是使用Task的一个demo代码Sum是一个声明好的外部函数, 当然我们也可以使用lambda来替代它这几句代码声明了一个Task 并且调用Start方法启动他,然后使用Wait方法等待这个异步任务的完成2.Ta... 阅读全文

posted @ 2010-11-24 14:16 听说读写 阅读(2766) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 3-4 锁-条件变量模式
摘要:条件变量模式(The Condition variable Pattern)指的是一个任务在等待一个变量的状态.(例如一个线程当变量为true的时候执行,否则就一直在休眠状态)以下代码演示了Thread1 一直在等待m_condition的状态Thread1在等待状态改变的过程中,间歇性的暂时释放锁的控制权这样Thread2就有机会获得到锁,改变m_condition的状态,并且执行Pulse(A... 阅读全文

posted @ 2010-11-23 18:06 听说读写 阅读(1878) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 3-3 Thread.Sleep -1 0 1 和其他
摘要:Thread.Sleep(-1)通知系统不要调度该线程,事实上这个方法没什么用,因为它让线程一直活着又什么都不做,建议是直接终结了现场Thread.Sleep(0)告诉系统当前线程不需要剩下的时间片了,请系统去调度其他的线程但是系统经过计划以后有可能还是觉得当前线程比较重要,又继续执行当前线程这取决于优先级,如果其他优先级都比当前优先级低的话,那么当前线程会继续Thread.Sleep(1)强制上... 阅读全文

posted @ 2010-11-19 17:20 听说读写 阅读(947) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 3-2 AutoResetEvent ManualResetEvent 和Semaphore
摘要:这三个对象都经常用于线程同步下面是一些他们的异同点1.当多个线程在等待一个 AutoResetEvent的时候,每次调用AutoResetEvent.Set()方法只会唤醒一个线程2.当多个线程在等待一个ManualResetEvent的时候,每次调用ManualResetEvent.Set()方法会唤醒所有等待的线程3.当多个线程在等待一个Semaphore的时候,每次调用Semaphore.R... 阅读全文

posted @ 2010-11-18 14:29 听说读写 阅读(640) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 3-1 一种单实例应用程序的实现(信号量)
摘要:单实例应用程序指的是在你的操作系统中你只能开一个的程序例如说outlook以下代码通过 Semaphore 实行了一个单实例的控制(事实上你使用EventWaitHandle 或者 Mutex都是可以的)原理是因为windows不允许重名的核心对象 ,例子中是 "SomeUniqueStringIdentifyingMyApp"第一次调用Semaphore的时候,系统将创建一个对象并将create... 阅读全文

posted @ 2010-11-18 14:07 听说读写 阅读(456) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 2-1 编译器优化导致的问题
摘要:DotNet项目在Debug 和Release 模式一个主要的差别就是有没有打开编译器优化在release下由于采用了编辑器优化,那么原来有些运行正常的代码就会出问题下面一段代码就是这样[代码]在Debug模式编译运行 你会发现程序正常的结束了在Release模式编译运行 你会发现程序进入了死循环 , 在while 那条语句这是由于编译器在优化模式下会认为s_stopWorker是一个常量(非tr... 阅读全文

posted @ 2010-11-15 19:51 听说读写 阅读(393) 评论(1) 推荐(0) 编辑

CLR via C# 读书笔记 1-3 前台线程和后台线程
摘要:前台线程(Foreground)后台线程(Background)相互作用:  当所有前台线程退出的时候, CLR会强制终止所有的后台线程,并且不会有异常抛出请参考以下代码(摘自CLR via C# ):代码转换  你可以在任何时候转换前台线程为后台线程,或者反过来. 只要线程还活着默认值:  主线程默认是前台线程  线程池默认是后台线程  新建的默认是后台线程何时使用?  非关键性事务或者可恢复性... 阅读全文

posted @ 2010-11-12 16:43 听说读写 阅读(506) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 1-2 创建线程的成本
摘要:在clr中创建线程的代价还是比较高的 ,他需要两个部分内存:线程核心对象, 存放描述线程的一些内容和上下文. (内存消耗:700B-2500B)线程环境,存放例如异常处理链之类. (内存消耗 1Page 4k-8k)用户模式堆栈, 存放 参数 变量等 ,这也就是平时我们说的堆栈和堆的区别中的堆栈 (内存消耗:1MB)核心模式堆栈, (内存消耗12KB-24KB)基本上看来好像就消耗了1MB多一些的... 阅读全文

posted @ 2010-11-12 15:55 听说读写 阅读(2887) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 1-1 何时使用线程或者线程池
摘要:一般来说在尽可能的情况下使用线程池 除了以下的4个情况需要手动控制线程运行在非默认的优先级上(不推荐)需要表现为前台线程需要长时间的运行一个任务想要手动控制一个线程的生命周期(例如Abort)-------------------------------其实我觉得还有两个重要的方面线程池是全局共享的,也就是说一个程序往线程池里面塞入一些任务 ,那么必然会影响到其他人极端的情况,就是你占用了所有的线... 阅读全文

posted @ 2010-11-12 15:38 听说读写 阅读(453) 评论(0) 推荐(0) 编辑

导航