基于 NET 并行库写的对象池

合集下载

基于.NET的企业级并行模型设计与实现

基于.NET的企业级并行模型设计与实现

De i n a di lme tt no tr rs a all o e a e n.e sg n mp e n ai f n ep iep r l d l s do n t o e em b WA G Z a-e L u, X A o —ag N h n i j , I i I OH ul n R i
王 占杰 , 李 锐 , 肖侯 亮
( 大连理工大学 计算机 系,辽 宁 大连 l62) 1 3 0 源, 为 快速 高效地进行 企业 业务处 理 , 建立 了一个 企业级 并行处 理模型 。提 出了业
务处 理与 业务请求相 互分 离, 绍 了.E 框 架下的远 程处 理机制 , 决 了服务 的注册 、 态加 载 、 求和 实现等相 关 问题 。 介 NT 解 动 请
针 对于企业 的网格 计算 目前还没 有出现太 多的应 用 。
本 文提出 了一种基 于. TR moi NE e t g机 制构建 的企业 并 n 行 计算模型 , 该模 型对外利用统一 的接 口提供 服务, 供客户端 调用 , 蔽企 业内部业务分布式并行处理 的实现细节 , 强安 屏 增 全 性能 , 提高 了企业应用开发 的扩展性 能, 内建立 了分布式 对 的计算模型 ,合理地利用 一些可用 的企 业资源 以提 高企业业
0 引 言
随着 企业应用 的不断发展 , 搭建一个 具有整合 、 开放 、 自 主和虚拟特 性的运作环 境是必不可 少的 。 满足用户个性化 需 求的运作 环境将彻底 改变企业 的成 本核算模式 。 很多企业 为 了保证业务不 间断地运 转将不得不花费大笔 的资金去购 买那 些 昂贵 的 I T设备, 除 了少数 的业 务高峰 时间外, 而 这些 计算 资源在 白白浪费 。如何 利用闲散 的计算潜力 ,已经不是 一个 新课题 了, 如计 算机集群 技术、 并行计算 技术等 。 而最有前 途 的解决方法 , 要数近年来 悄然 兴起 的网格计算( icmp t g g d o ui ) r n 技术 。 网格计算 的基 本思想 是将 分布于 不同地理位置 的计算 机、 数据 库 、 存储器 和软件等 资源, 利用 高速的因特 网连 成一

.netcore parallel应用实例

.netcore parallel应用实例

一、介绍在软件开发中,并行处理是一项重要的技术,它可以大大提高程序的执行效率和性能。

.NET Core是微软推出的跨评台开发框架,它具有丰富的并行处理功能,可以轻松地实现并行化的应用程序。

本文将介绍.NET Core中并行处理的应用实例,帮助读者更好地理解并利用并行处理技术。

二、并行处理的概念1. 并行处理是指同时处理多个任务,通过同时利用多个处理单元来提高程序的执行效率。

在单核处理器时代,人们通过线程来实现并行处理;而在多核处理器时代,可以通过多线程和任务并行等方式来实现并行处理。

2. .NET Core中并行处理的功能.NET Core提供了丰富的并行处理功能,其中包括并行LINQ、Parallel类、Task类等。

这些功能可以帮助开发者简单快速地实现并行化的应用程序,提高程序的执行效率和性能。

三、并行处理的应用实例下面我们将通过一个简单的示例来演示如何在.NET Core中实现并行化的应用程序。

1. 示例需求假设我们需要对一个包含大量元素的数组进行求和操作,串行的方式需要遍历整个数组,效率较低。

我们希望通过并行处理来提高求和的效率。

2. 串行求和的实现方式首先我们用串行的方式来实现对数组的求和操作,示例代码如下所示:```csharpstatic void M本人n(string[] args){int[] nums = new int[xxx];for (int i = 0; i < nums.Length; i++){nums[i] = i + 1;}int sum = 0;foreach (var num in nums){sum += num;}Console.WriteLine("串行求和结果:" + sum);```3. 并行求和的实现方式接下来我们使用.NET Core的并行处理功能来实现对数组的求和操作,示例代码如下所示:```csharpstatic void M本人n(string[] args){int[] nums = new int[xxx];for (int i = 0; i < nums.Length; i++){nums[i] = i + 1;}int sum = 0;Parallel.For(0, nums.Length, i =>{Interlocked.Add(ref sum, nums[i]);});Console.WriteLine("并行求和结果:" + sum);```通过上述示例代码,我们可以看到串行求和和并行求和的实现方式有所不同。

并行计算

并行计算

VS2010中Parallel类实现并行计算本文来自IT168网站作者:陈良乔在本系列的第一篇文章“Visual Studio 2010对并行计算的支持”中,我们简要地介绍了微软为并行计算提供了完整的解决方案。

如果你是一个.NET程序员,同时又在进行并行计算方面的开发,那么即将发布的.NET Framework 4.0将是微软送给你的一份大礼。

在.NET Framework 4.0中,在库的层次上,微软提供了大量的新内容来帮助程序员完成应用程序的并行化,其中包括Parallel LINQ(PLINQ),Task Parallel Library(TPL)和Coordination Data Structures。

这里我们就先来介绍一下最简单最常用的TPL。

将跟随Visual Studio 2010一起发布的.NET Framework 4.0将包含很多基于库的对并行计算的支持。

包括数据的并行化,任务的并行化等等,这一切都通过一个共同的工作调度器进行管理。

这些新的类型和类,将在System.Threading,System.Threading.Tasks,System.Linq,和System.Collections.Concurrent这些名字空间中提供。

通过这些新的类型和类,开发人员将无需面对如今复杂的多线程开发模式,而可以直接使用.NET Framework,更加高效简便地开发支持并行计算的应用程序,从而更加充分地利用多核CPU的优势,随着计算核心或者处理器的增加,以提升应用程序的性能。

而在.NET Framework中,Task Parallel Library (TPL)是其Parallel Extensions中一个重要组成部分,它提供了一种简便的多线程开发方式,通过它所提供的类或者函数,可以让程序员轻松地实现并行计算。

其中,最简单的就是它的Parallel类Parallel类Parallel类就是TPL中的一个用于支持并行计算的类。

详细的.Net并行编程高级教程--Parallel

详细的.Net并行编程高级教程--Parallel

详细的.Net并行编程高级教程--Parallel一直觉得自己对并发了解不够深入,特别是看了《代码整洁之道》觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准。

而且在《失控》这本书中也多次提到并发,不管是计算机还是生物都并发处理着各种事物。

人真是奇怪,当你关注一个事情的时候,你会发现周围的事物中就常出现那个事情。

所以好奇心驱使下学习并发。

便有了此文。

一、理解硬件线程和软件线程多核处理器带有一个以上的物理内核--物理内核是真正的独立处理单元,多个物理内核使得多条指令能够同时并行运行。

硬件线程也称为逻辑内核,一个物理内核可以使用超线程技术提供多个硬件线程。

所以一个硬件线程并不代表一个物理内核;Windows中每个运行的程序都是一个进程,每一个进程都会创建并运行一个或多个线程,这些线程称为软件线程。

硬件线程就像是一条泳道,而软件线程就是在其中游泳的人。

二、并行场合.Net Framework4 引入了新的Task Parallel Library(任务并行库,TPL),它支持数据并行、任务并行和流水线。

让开发人员应付不同的并行场合。

∙数据并行:有大量数据需要处理,并且必须对每一份数据执行同样的操作。

比如通过256bit的密钥对100个Unicode字符串进行AES算法加密。

∙任务并行:通过任务并发运行不同的操作。

例如生成文件散列码,加密字符串,创建缩略图。

∙流水线:这是任务并行和数据并行的结合体。

TPL引入了System.Threading.Tasks ,主类是Task,这个类表示一个异步的并发的操作,然而我们不一定要使用Task类的实例,可以使用Parallel静态类。

它提供了 Parallel.Invoke, Parallel.For Parallel.Forecah 三个方法。

三、Parallel.Invoke试图让很多方法并行运行的最简单的方法就是使用Parallel类的Invoke 方法。

一起谈.NET技术,4.0中的并行计算和多线程详解(一)

一起谈.NET技术,4.0中的并行计算和多线程详解(一)

⼀起谈.NET技术,4.0中的并⾏计算和多线程详解(⼀) 并⾏计算部分 沿⽤微软的写法,System.Threading.Tasks.::.Parallel类,提供对并⾏循环和区域的⽀持。

我们会⽤到的⽅法有For,ForEach,Invoke。

⼀、简单使⽤ ⾸先我们初始化⼀个List⽤于循环,这⾥我们循环10次。

(后⾯的代码都会按这个标准进⾏循环)1. Program.Data = new List<int>();2. for (int i = 0; i < 10; i++)3. {4. Data.Add(i);5. } 下⾯我们定义4个⽅法,分别为for,foreach,并⾏For,并⾏ForEach。

并测试他们的运⾏时长。

三、并⾏循环中为数组/集合添加项 上⾯的应⽤场景其实并不是⾮常多见,毕竟只是为了遍历⼀个数组内的资源,我们更多的时候是为了遍历资源,找到我们所需要的。

那么请继续看。

下⾯是我们⼀般会想到的写法: 这是因为List 是⾮线程安全的类,我们需要使⽤System.Collections.Concurrent 命名空间下的类型来⽤于并⾏循环体内。

类说明BlockingCollection<T>为实现 IProducerConsumerCollection<T> 的线程安全集合提供阻⽌和限制功能。

ConcurrentBag<T>表⽰对象的线程安全的⽆序集合。

ConcurrentDictionary<TKey,TValue>表⽰可由多个线程同时访问的键值对的线程安全集合。

ConcurrentQueue<T>表⽰线程安全的先进先出 (FIFO) 集合。

ConcurrentStack<T>表⽰线程安全的后进先出 (LIFO) 集合。

OrderablePartitioner<TSource>表⽰将⼀个可排序数据源拆分成多个分区的特定⽅式。

基于.NET技术的通用系统多层对象模型的构建

基于.NET技术的通用系统多层对象模型的构建

dvl l bet oe o gnrl u iyr plai yt ae i N T t h i e i l i s g ee pa j d l f ee hl e api tn s e bsdO o lo c m a m a c o sm l. E cn u ,n u n ui e q cdg n
A bet d l f e ea muta e p l ain no jc mo e o n r l lly ra pi t g i c o
s se a e n . y tm b s d o NET e h i u tc nq e
j圣 Yu n 二 D a
(I D l o Ifr t nr f noma o  ̄ i eigS - o b由曲谢 & C n ec , r ,d∞l n f o ml  ̄l r
2 1 年第3 00 期
中图分类号: l . 哪 11 文献标识码 : A 文章编 号:09 522 1)3一 06— 4 10 —25 (oO0 O2 0
基 于 .E N T技术 的通 用 系统 多层 对 象模 型 的构 建
姚 远
( 武汉工业 学院工商学院信息工程系 , 武汉 401) 309
m ngn et ntsae, de . l r ette hlp t e f e ee l b cm d1A e n, aaet n il ra t Ia o e n o iu t nr j t oe.t d m o h y n c t s p s sh w e c r o h gt— rc s i o o e t t i lme t a c e s a e o p l a o E a poes a g n c mp n n o mp e n d t a c l r f a p i t n,u ig y e ttbe a s y ci s t d d a l n p a a

浅谈.Net的并发与并行

浅谈.Net的并发与并行来源:寒江独钓链接:/yangecnu/p/Something-about-Concurrent-and-Parallel- Programming.html一、引言前天在GitHub上看到一幅图,问如何向五岁的小孩讲解并发和并行。

然后有人以这幅图做答:这幅图有点儿意思,用咖啡机的比喻来形容并发和并行,从中最直接的体会是,并发是有状态的,某一线程同时执行一个任务,完了才能进行到下一个,而并行是无状态的。

近些年,计算机的处理能力成指数能力增长。

处理能力也越来越快,以前的一些工作站现在都可以移植到笔记本电脑或者手持设备上。

但是近几年,由于处理器的处理速度已经达到了极限,所以处理器开始向多核方向发展,而提高程序性能的一个最简单的方式之一就是充分利用多核处理器的计算资源。

但要编写利用多核处理器处理的程序并不那么简单。

所以一些函数是编程语言,如F#,Scala,Erlang等又开始流行起来,因为他们带来的不可变性,递归思想等在一定程度上简化了并行和并发编程。

本文和下文从任务并行和数据并行两个方面,简要讨论一下.NET 中的并行编程。

这篇文章不可能讲完所有的API,框架,工具或者设计模式。

对着方面感兴趣的同学可以看看专门的书籍如Concurrent Programming on Windows 、Concurrency and Parallelism in .NET,这些书专门讲解了.NET中的并发和并行编程,本文主要参考.NET Performance 一书的部分章节。

二、问题及挑战对于并行,我们面临的另外一个挑战是多核系统的异质性。

CPU 制造商现在开始为面向用户的系统开发4核,8核或者更多内核的CPU。

而且,目前的工作站或者高级点的笔记本电脑(移动工作站)通常具有强大的图形处理器(GPU), 这种强大的GPU支持成百上千的个线程同步。

如何充分利用GPU在某些方面的计算性能,以及如何在CPU与GPU 上分配任务,CPU和GPU的异质性在一定程度上影响了并行开发。

.NET4.0并行计算技术基础(4)

.NET4.0并行计算技术基础(4).NET4.0并行计算技术基础(4)19.3 让一切“并行”——任务并行库原理及应用19.3.1 任务并行库简介任务并行库(TPL:Task Parallel Library)是.NET 4.0为帮助软件工程师开发并行程序而提供的一组类,位于System.Threading和System.Threading.Tasks这两个命名空间中,驻留在3个.NET核心程序集mscorlib.dll、System.dll和 System.Core.dll里。

使用这些类,可以让软件工程师在开发并行程序时,将精力更关注于问题本身,而不是诸如线程的创建、取消和同步等繁琐的技术细节。

使用TPL开发并行程序,考虑的着眼点是“任务(task)”而非“线程”。

一个任务是一个Task类的实例,它代表某个需要计算机执行的数据处理工作,其特殊之处在于:在TPL中,任务通常代表一个可以被计算机并行执行的工作。

任务可以由任何一个线程执行,特定的任务与特定的线程之间没有绑定关系。

在目前的版本中,TPL使用.NET线程池中的线程来执行任务。

负责将任务“分派”到线程的工作则“任务调度器(Task Scheduler)”负责。

任务调度器集成于线程池中。

我们在前面介绍并行计算基本原理时,曾经介绍过OpenMP,通过在Fortran 或C/C++代码中添加特定的编译标记,实现了OpenMP标准的编译器会自动地生成相应的并行代码。

然而,TPL采用了另一种实现方式,它自行是作为.NET平台的一个有机组成部分而出现的,并不对编译器提出特殊要求,当应用程序使用TPL编写并行程序时,所有代码会被直接编译为IL指令,然后由CLR负责执行之,整个过程完全等同于标准的.NET应用程序。

换言之,对于应用软件开发工程师而言,使用TPL开发并行程序,在编程方式上没有任何变化,只不过是编程时多了几个类可用,并且处理数据时需要使用并行算法。

.net concurrentqueue 原理

concurrentqueue 原理.NET 中的 ConcurrentQueue 是一种线程安全的队列数据结构,它允许多个线程同时访问和操作队列,而不需要额外的同步措施(如锁)。

它是通过利用 .NET Framework 中的 System.Threading 命名空间下的并发编程工具和数据结构来实现线程安全性的。

ConcurrentQueue 的原理主要包括以下几个关键点:1. 底层数据结构:ConcurrentQueue 的底层数据结构通常是基于链表(linked list)的,它由节点(Node)组成,每个节点包含一个元素和一个指向下一个节点的引用。

这种数据结构支持高效的队列操作,如入队(Enqueue)和出队(Dequeue)。

2. 无锁算法:ConcurrentQueue 使用无锁(lock-free)算法,这意味着多个线程可以同时对队列进行操作,而不会发生竞争条件或死锁。

它使用原子操作来确保线程安全性,如CAS(Compare-And-Swap)。

3. CAS 操作:ConcurrentQueue 中的入队和出队操作使用CAS 操作来保证线程安全。

CAS 是一种原子操作,它允许在不使用锁的情况下修改内存中的值。

这意味着如果一个线程正在执行入队或出队操作,其他线程可以同时进行其他操作,而不会阻塞。

4. 多生产者和多消费者:ConcurrentQueue 支持多个生产者和多个消费者同时访问队列。

这使得它适用于并行编程场景,其中多个线程需要安全地访问共享队列。

5. 高性能:ConcurrentQueue 在多线程环境中表现出色,因为它避免了锁的争用,允许更多的并发操作。

总之,ConcurrentQueue 的原理基于无锁算法和原子操作,它提供了高性能和线程安全的队列实现,适用于多线程和并行编程中需要处理队列的场景。

通过使用 ConcurrentQueue,开发人员可以避免手动管理锁和同步问题,从而更容易编写高效的多线程代码。

.net处理插入并发的方法

.net处理插入并发的方法处理并发插入的方法在.NET中有多种选择,具体取决于你的应用程序的需求和使用的数据库类型。

以下是一些常见的方法:1. 使用数据库的事务,在.NET中,可以使用或Entity Framework等技术来执行数据库事务。

通过使用事务,可以确保在插入数据时保持数据库的一致性。

你可以使用事务来锁定要插入的数据行,以防止其他并发操作对相同数据进行插入。

这可以通过使用数据库连接对象的事务功能来实现。

2. 使用锁机制,在.NET中,可以使用锁机制来处理并发插入。

例如,可以使用C#中的lock关键字或者Monitor类来确保在同一时间只有一个线程可以执行插入操作。

这可以帮助避免多个线程同时插入相同的数据。

3. 使用数据库的并发控制功能,许多数据库系统都提供了并发控制功能,例如行级锁或乐观并发控制。

你可以在数据库中配置这些功能,以确保在并发插入时不会发生数据冲突。

4. 使用队列,另一种处理并发插入的方法是使用队列。

你可以将要插入的数据放入队列中,然后使用单个线程来处理队列中的数据,这样可以避免并发插入导致的数据冲突。

5. 使用分布式事务,如果你的应用程序是分布式的,可以考虑使用分布式事务来处理并发插入。

.NET框架提供了支持分布式事务的功能,可以帮助你确保在不同数据库之间执行插入操作时保持一致性。

总之,在处理并发插入时,需要考虑数据一致性和性能之间的平衡。

你需要根据具体的应用场景和需求选择合适的方法来处理并发插入操作。

同时,要确保对并发操作进行充分的测试和验证,以确保你选择的方法能够满足应用程序的需求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于.NET 并行库写的对象池ObjectPoolBase类,大家不用去了解TObjectPool, TObjectPoolDomain, TObjectDomain三个泛型参数,改成一个TObject也可以使用。

其构造中的四个参数分别代表:minSize:池中最少个数maxSize:池中最大个数growSize:增长/回收个数maintenanceMilliseconds:维护间隔运行机制:在BorrowObject时,如果可以在FREES中取得对象则返回,如果获取失败,则当池中对象个数小于最大个数时,创建对象,否则等待对象返还并重试。

当使用完对象时可通过ReturnObject返还对象,对象池在指定的maintenanceMilliseconds的间隔内会维护池子的大小,可重载对象池的OnCreateObject创建对象,OnDestroyObject销毁对象,OnActiveObject激活对象和OnDeactivate使对象进入休眠,可使用USING语句在跳出代码块是自动返还对象。

using(var po = ObjectPool.GetPoolPoolObject()){po.Object.xxx();....}具体代码如下:public abstract class ObjectPoolBase<TObjectPool, TObjectPoolDomain, TObject, TObjectDomain>where TObjectPool : ObjectPoolBase<TObjectPool, TObjectPoolDomain, TObject, TObjectDomain>where TObject : class{static ObjectPoolBase(){Instance = ContainerManager.Resolve<TObjectPool, TObjectPoolDomain>();ObjectPoolManager.Instance.RegisterObjectPool<TObjectPool, TObjectPoolDomain, TObject, TObjectDomain>(Instance);}public static TObjectPool Instance{get;private set;}public static IPoolObject<TObject> GetPoolObject(){return new InternalPoolObject();}private ConcurrentBag<TObject> frees;private ConcurrentDictionary<TObject, byte> borrowed;private long count;private int minSize;private int growSize;private int maxSize;private long maintenanceMilliseconds;private Timer maintenanceTimer;private AutoResetEvent are;private volatile bool exit;protected ObjectPoolBase(int minSize, int growSize, int maintenanceMillseconds) : this(minSize, int.MaxValue, growSize, maintenanceMillseconds) {}public ObjectPoolBase(int minSize, int maxSize, int growSize, int maintenanceMillseconds){CheckUtility.ArgumentPositiveNumber(minSize, "minSize");CheckUtility.ArgumentPositiveNumber(growSize, "growSize");CheckUtility.ArgumentPositiveNumber(maintenanceMillseconds, "maintenanceMillseconds");CheckUtility.ArgumentGreaterThanArgument(minSize, "minSize", maxSize, "maxSize");this.minSize = minSize;this.growSize = growSize;this.maxSize = maxSize;this.maintenanceMilliseconds = maintenanceMillseconds;this.frees = new ConcurrentBag<TObject>();this.borrowed = new ConcurrentDictionary<TObject, byte>();this.count = 0;this.are = new AutoResetEvent(false);this.exit = false;this.maintenanceTimer = new Timer(this.TaskMaintenance, null, this.maintenanceMilliseconds, Timeout.Infinite);}public void Shutdown(){if (this.exit){return;}this.exit = true;this.are.WaitOne();}private bool ShutdownIfExit(){if (this.exit){this.are.Set();}return this.exit;}private void WriteToLog(string messageFormat, params object[] args){string message = CheckUtility.ArrayIsNullOrEmpty(args) ? messageFormat : string.Format(messageFormat, args);LoggingWriter.WriteFormat("[{0}] {1} {2}", this.PoolName, message, this);}private void TaskMaintenance(object state){this.WriteToLog("Trigger Maintenance");if (this.ShutdownIfExit()){return;}Task.Factory.StartNew(() =>{if (this.ShutdownIfExit()){return;}this.WriteToLog("Begin Maintenance");if (Interlocked.Read(ref this.count) <= this.maxSize){lock (this){if (Interlocked.Read(ref this.count) <= this.maxSize){if (this.frees.Count > this.minSize){this.MaintenanceDestroy(Math.Min(this.growSize, Math.Abs(this.frees.Count - this.minSize)));}else if (this.frees.Count < this.minSize){this.MaintenanceCreate(Math.Min(this.growSize, Math.Abs(this.frees.Count - this.minSize)));}}}}this.WriteToLog("After Maintenance");if (this.ShutdownIfExit()){return;}this.maintenanceTimer.Change(this.maintenanceMilliseconds, Timeout.Infinite);}, TaskCreationOptions.LongRunning);}public TObject BorrowObject(){this.WriteToLog("Before Borrow");TObject t;do{if (!this.frees.TryTake(out t)){lock (this){while (!this.frees.TryTake(out t)){if (this.exit){throw new ObjectDisposedException(this.GetType().FullName);}long count = Interlocked.Read(ref this.count);if (Interlocked.Read(ref this.count) >= this.maxSize){Monitor.Wait(this, 10000);continue;}else{long growSize = Math.Min(this.growSize, Math.Abs(this.count + this.growSize - this.maxSize));if (growSize <= 0){Monitor.Wait(this, 10000);continue;}else{this.MaintenanceCreate(growSize);}}}}}} while (!this.ActiveObject(t));this.borrowed.TryAdd(t, 0);this.OnBorrow(t);this.WriteToLog("AfterBorrow");return t;}protected virtual void OnBorrow(TObject obj){}public void ReturnObject(TObject obj){"obj".NullArgument(obj);this.WriteToLog("Before Return");byte b;if (!this.borrowed.TryRemove(obj, out b)){throw new InvalidOperationException(SR.InvalidObjectForPool);}if (this.DeactiveObject(obj)){this.frees.Add(obj);}else{Interlocked.Decrement(ref this.count);}this.WriteToLog("After Return");}protected void MaintenanceCreate(long size){this.WriteToLog("Before Maintenance Create size: {0}", size);Parallel.For(0, size, (i) =>{if (this.exit){return;}if (Interlocked.Read(ref this.count) < this.maxSize){TObject t;if (this.CreateObject(out t)){this.frees.Add(t);Interlocked.Increment(ref this.count);}}});this.WriteToLog("After Maintenance Create");}protected void MaintenanceDestroy(long size){this.WriteToLog("Before Maintenance Destroy size: {0}", size);Parallel.For(0, size, (i) =>{if (this.exit){return;}TObject t;if (this.frees.TryTake(out t)){this.DestroyObject(t);Interlocked.Decrement(ref this.count);}});this.WriteToLog("After Maintenance Destroy");}private bool CreateObject(out TObject t){this.WriteToLog("Create Object");t = default(TObject);try{t = this.OnCreateObject();if (null == t){throw new NullReferenceException(SR.CreatedNullObjectForPool);}this.WriteToLog("Object Created");return true;}catch (Exception e){LoggingWriter.WriteLog(e);return false;}}protected virtual TObject OnCreateObject(){return ContainerManager.Resolve<TObject, TObjectDomain>();}private bool ActiveObject(TObject t){this.WriteToLog("Active Object");try{this.OnActiveObject(t);return true;}catch (Exception e){LoggingWriter.WriteLog(e);this.DestroyObject(t);return false;}}protected virtual void OnActiveObject(TObject obj) {}private bool DeactiveObject(TObject t){this.WriteToLog("Deactive Object");try{this.OnDeactivateObject(t);return true;}catch (Exception e){LoggingWriter.WriteLog(e);this.DestroyObject(t);return false;}}protected virtual void OnDeactivateObject(TObject obj) {}private void DestroyObject(TObject t){this.WriteToLog("Destroy Object");try{byte b;if (this.borrowed.TryRemove(t, out b)){Interlocked.Decrement(ref this.count);this.OnDestroyObject(ref t);}}catch (Exception e){LoggingWriter.WriteLog(e);}}protected virtual void OnDestroyObject(ref TObject obj){IDisposable disposable = obj as IDisposable;if (null != disposable){try{disposable.Dispose();}catch (Exception e){LoggingWriter.WriteLog(e);}}else{obj = null;}}public virtual string PoolName{get{return typeof(TObjectPool).Name;}}public override string ToString(){return string.Format("[Pool Info] count: {0}, frees {1}, borrowed {2}, minSize {3}, maxSize {4} growSize {5}",Interlocked.Read(ref this.count),this.frees.Count,this.borrowed.Count,this.minSize,this.maxSize,this.growSize);}private class InternalPoolObject : IPoolObject<TObject>, IDisposable{private TObject obj;public InternalPoolObject(){this.obj = null;}public TObject Object{get{if (null == this.obj){this.obj = Instance.BorrowObject();}return this.obj;}}public void Dispose(){if (null != this.obj){Instance.ReturnObject(this.obj);}}}}。

相关文档
最新文档