CLR最近异步操作和多线程的学习心的
2010-04-15 00:07
190 查看
最近发现看过的东西经常记不住,想想应该定期回顾下,写写学习笔记,看来真的老了- -。
最近项目里面的兄弟们被各种并发操作,多线程操作搞的颇为狼狈,这部分的只是很有必要多多学习下(其实我个人认为还是由于一些需求策划上的不理智,自己给自己制造并发的麻烦,如果有个稍微妥协的决定,结果一定能好很多。)
线程增加了系统的健壮性和cpu的充分的利用,但是其自身的上下文切换还是有很大的开销。具体参看操作系统书籍。
CLR的一个进程内会维护一个线程池,线程池被该进程内所有应用程序域共享。线程池分为两类,一类是work thread( compute-bound operation,计算密集型线程),一类是IO thread( I/O-bound operation,IO密集型),IO密集型线程可以在不占用CPU的情况下通过设备驱动程序进行IO操作,比如带BeginXXX和endxxx方法的文件操作,网络访问等类型。
线程池大概的工作情况是这样,当开始线程池里面没有线程的情况下,当有应用程序需要线程池中线程进行工作,线程池将会新建一个线程进行工作,之后到来的请求,线程池都会尽量使用这个线程进行响应,如果请求过多的话,线程池将会创建新的线程进行响应直到达到上限。当线程池中的线程处于空闲状态一定时间后(具体多少看环境)线程池池内的空闲线程将会进行自我终结。
线程池的使用方法,最简单可以这样,当然有个重要的缺陷是我们无法知道该委托的操作什么时候完成,有没有报错。
ThreadPool.QueueUserWorkItem(p =>
{
Console.WriteLine("do something");
});
当然还可以使用using System.Threading.Tasks下的task类,在CLR VIA C# 3rd中对此有很详细的介绍,这也是第3版比起第2版多的部分,而且多了很多,刚刚下载,得仔细看看。
异步操作其实更多时候还是使用APM模式,也就是通过委托的BeginInvoke和endinvoke,或者是支持IO异步的各种其他方法。
错误的用法:
1、在线程池中调用thread.sleep会导致该线程池中的线程挂起,无法回到池中,当然无法分担其他任务。
2、调用beginvoke却不调用endinvoke也会使得资源无法回收。
3、注意在异步操作中的错误处理,如果不捕获会导致该所属进程崩溃。
累。。。明天继续写。。。
最近项目里面的兄弟们被各种并发操作,多线程操作搞的颇为狼狈,这部分的只是很有必要多多学习下(其实我个人认为还是由于一些需求策划上的不理智,自己给自己制造并发的麻烦,如果有个稍微妥协的决定,结果一定能好很多。)
线程增加了系统的健壮性和cpu的充分的利用,但是其自身的上下文切换还是有很大的开销。具体参看操作系统书籍。
CLR的一个进程内会维护一个线程池,线程池被该进程内所有应用程序域共享。线程池分为两类,一类是work thread( compute-bound operation,计算密集型线程),一类是IO thread( I/O-bound operation,IO密集型),IO密集型线程可以在不占用CPU的情况下通过设备驱动程序进行IO操作,比如带BeginXXX和endxxx方法的文件操作,网络访问等类型。
线程池大概的工作情况是这样,当开始线程池里面没有线程的情况下,当有应用程序需要线程池中线程进行工作,线程池将会新建一个线程进行工作,之后到来的请求,线程池都会尽量使用这个线程进行响应,如果请求过多的话,线程池将会创建新的线程进行响应直到达到上限。当线程池中的线程处于空闲状态一定时间后(具体多少看环境)线程池池内的空闲线程将会进行自我终结。
线程池的使用方法,最简单可以这样,当然有个重要的缺陷是我们无法知道该委托的操作什么时候完成,有没有报错。
ThreadPool.QueueUserWorkItem(p =>
{
Console.WriteLine("do something");
});
当然还可以使用using System.Threading.Tasks下的task类,在CLR VIA C# 3rd中对此有很详细的介绍,这也是第3版比起第2版多的部分,而且多了很多,刚刚下载,得仔细看看。
异步操作其实更多时候还是使用APM模式,也就是通过委托的BeginInvoke和endinvoke,或者是支持IO异步的各种其他方法。
错误的用法:
1、在线程池中调用thread.sleep会导致该线程池中的线程挂起,无法回到池中,当然无法分担其他任务。
2、调用beginvoke却不调用endinvoke也会使得资源无法回收。
3、注意在异步操作中的错误处理,如果不捕获会导致该所属进程崩溃。
累。。。明天继续写。。。
相关文章推荐
- Cocos2dx学习笔记36 多线程与异步加载
- Windows 8学习笔记(二十一)--C++ 文件异步操作
- [CLR via C#]26. 计算限制的异步操作
- ajax异步操作学习
- asynctask 异步线程类进行多线程操作
- 关于异步更新UI界面多线程执行后台操作的一些思路整理
- 学习Android第8天,Asynctask的使用(异步操作)
- C# 多线程与异步操作实现的探讨(非原创)
- ES6学习15(异步操作和Async函数)
- .NET异步操作学习之一:Async/Await中异常的处理
- boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等
- lock Mutex Monitor 之间的区别与详解, .net 多线程 同步异步操作,锁
- java多线程之synchornized原理以及原子操作探究学习
- !!c# 委托与多线程 -- 相比background来说,本方法针对当需要通过异步代理发起UI操作,而后线程中进行sleep操作的时使用
- [学习记录]简单的异步操作
- 多线程之 NSOperation 与 NSOperationQueue 的基本操作 适合基础学习
- boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等
- android学习——AsyncTast 异步操作和 ProgressBar
- 异步操作c#书籍学习例子
- .Net学习难点讨论系列13 – 异步操作