复习及总结--.Net线程篇(2)
复习总结
上一篇里讲到了使用委托异步调用的方式来使用多线程,这里介绍几个概念
这里贴出来一个关于应用程序域的帖子
http://www.cnblogs.com/firstyi/archive/2008/03/14/1106068.html
http://www.cnblogs.com/xiashengwang/archive/2012/07/17/2594623.html
一,Appdomain概述
CLR COM服务器初始化时,会创建一个AppDomain。AppDomain是一组程序集的逻辑容器。宿主可以通过CLR创建额外的AppDomain。AppDomain的唯一作用就是隔离。下面是它的具体功能。
●一个AppDomain中的代码创建的对象不能由另一个AppDomain中的代码直接访问。
●AppDomain可以卸载。
●AppDomain可以单独保护。AppDomain在创建后,会应用一个权限集,它决定了在这个AppDomain中运行的程序集的最大权限。
●AppDomain可以单独实施配置。AppDomain在创建后,会关联一组配置设置。这些设置主要影响CLR在AppDomain中加载程序集的方式。这些设置涉及搜索路径,版本绑定重定向,卷影复制及加载器优化。
线程池的作用--http://www.cnblogs.com/JeffreyZhao/archive/2009/07/22/thread-pool-1-the-goal-and-the-clr-thread-pool.html
其实“线程池”就是用来存放“线程”的对象池。
在程序中,如果某个创建某种对象所需要的代价太高,同时这个对象又可以反复使用,那么我们往往就会准备一个容器,用来保存一批这样的对象。于是乎,我们想要用这种对象时,就不需要每次去创建一个,而直接从容器中取出一个现成的对象就可以了。由于节省了创建对象的开销,程序性能自然就上升了。这个容器就是“池”。很容易理解的是,因为有了对象池,因此在用完对象之后必须有一个“归还”的动作,这样便可以把对象放回池中,下次需要的时候就可以再次拿出来使用了。
例如,我们在使用ADO.NET连接SQL Server时,.NET框架就会自动帮我们维护一个连接池,这就是因为重新创建一个连接的代价相对比较高昂,“复用”就显得比较划算了。不过有些朋友可能会说,我们明明是每次都创建一个SqlConnection对象,哪里有“复用”啊?这是因为.NET框架中把“连接池”做透明了,对于程序员完全隐藏了这个概念。每次我们虽然创建的是新的SqlConnection对象,但是这个对象内部占用的“数据库连接”还是会复用的。为什么总是强调用完SqlConnection对象后要及时“关闭”(Dispose或Close)呢?其实这里并没有断开数据库连接,只是把这个连接放回了连接池。等到下次创建新的SqlConnection对象时,这个连接又可以拿出来用了。
既然我们每次都是从池中获取对象,那么这些对象是由谁来创建,又是什么时候创建的呢?这个就要根据不同情况由各对象池来自行实现了。例如,可以在创建对象池的时候指定池内对象数量,并且一下子全部创建好,当然您也可以在得到请求时,如果发现池中已经没有剩余对象时创建。您也可以“事前”先准备一部分,“事中”根据需要再继续补充。还可以做得“智能”一些,例如,根据实际情况添加或删除一些对象,甚至对需求“走势”进行“预测”,在空闲时便创建更多的对象以备“不时之需”。各中变化难以言尽。
当然,它们的原理和目的是类似的。相信上面这段文字也已经讲清了“线程池”的作用:因为创建一个线程的代价较高,因此我们使用线程池设法复用线程。就是这么简单。
二,ThreadPool线程池:维护1个至n个线程,操作系统从请求队列中提取请求分配个线程池中的适合线程处理。
http://www.cnblogs.com/sashow/archive/2007/02/08/644679.html 线程池的知识
MSDN中介绍线程池
许多应用程序创建的线程都要在休眠状态中消耗大量时间,以等待事件发生。 其他线程可能进入休眠状态,只被定期唤醒以轮询更改或更新状态信息。 线程池通过为应用程序提供一个由系统管理的辅助线程池,使您可以更为有效地使用线程。 使用线程池线程的操作示例包括以下内容:
-
当创建 Task 或 Task<TResult> 对象来异步执行某些任务时,默认情况下,计划任务将在线程池线程上运行。
-
异步计时器使用线程池。 线程池线程执行来自 System.Threading.Timer 类的回调,并从 System.Timers.Timer 类引发事件。
-
当使用已注册的等待句柄时,系统线程将监视等待句柄的状态。 当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数。
今天就了解两个基本概念吧, AppDomain和ThreadPool
下一篇介绍下Task
顺便贴出来Thread的几个方法