.Net Core中ObjectPool的使用与源码解析_实用技巧

来源:脚本之家  责任编辑:小易  

缺少元件addsub_ovcy的声明。你在addsub_ovcy_1:addsub_ovcy.中例化了模板元件 addsub_ovcy,但是却没有在结构体开始的地方声明这个元件www.zgxue.com防采集请勿采集本网。

一、对象池  

Net Core不是特别好理解,也许最好考虑对.Net进行彻底重构以支持跨平台开发,.Net Core已经迅速成为.Net基金会开源工作的核心。Net Core可以比其他.Net运行时和库更快地响应对新平台的需求。例如,三星

运用对象池化技术可以显著地提升性能,尤其是当对象的初始化过程代价较大或者频率较高。下面是ObjectPool源码中涉及的几个类。当你看过.Net Core源码很多时,你会发现,微软的开发很多都是这种模式,通过Policy构建Provider,通过Provider创建最终的类。

.Net Framework是相对旧的技术;net Core是微软最新推的框架,开源的。Net Framework的项目只能在windows平台上运行,而.net Core是可以跨平台运行的。这么看.net Core是优于.Net Framework的。

二、使用

这个组件的目的主要是将对象保存到对象池,用的时候直接去取,不需要重新创建,实现对象的重复利用。但是有个问题,假如对象池中开始没有对象或者取得数量大于对象池中的数量怎么办?在对象池中对象的数量不足时,此时来取对象,需要通过Policy创建对象,至于怎么创建对象,是你需要实现的。Policy如上图,有个默认实现  DefaultPooledObjectPolicy ,它的创建就是 new T().

这两款都是笔记本用的处理器, i5 4210 主频1.7GHz i5 5200 主频2.2GHz 功耗都是15W 从主频这一项来看:i5 5200要比i5 4210要好,价格要贵些!建议尽量购买i5 5200系列配置的笔记本。

DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new DefaultPooledObjectPolicy<User>(), 2); var firstUser=defaultPool.Get();//从对象池中取一个对象,此时对象池中还没有对象,返回 Age=0 Name=null var user1 = new User() { Age = 18, Name = "MicroHeart" }; var user2 = new User() { Age = 19, Name = "MicroHeart" }; var user3 = new User() { Age = 20, Name = "MicroHeart" }; defaultPool.Return(user1);//将对象放回对象池中,但是不一定成功。对象池有数量限制,而且也可以自定义限制,让一些对象不能放入对象池中 defaultPool.Return(user2); defaultPool.Return(user3); var u1 = defaultPool.Get();//从对象池中取一个对象,返回第一个放入的user1 var u2 = defaultPool.Get();//从对象池中取一个对象,返回第二个放入的user2 var u3 = defaultPool.Get();//此时对象池中没有对象了,获取对象调用的Policy的Create方法,而DefaultPooledObjectPolicy的Create方法的实现是:new T(),所以返回 Age=0 Name=null

CPU倍频。如果你想手动超频,请设置为手动。不超频的话就默认自动就行

上面例子当对象池中没有对象是,调取获取方法,其实就是new T()。下面在对象中添加3个对象,但是对象池中只有2个空间,所以第三个是添加不进去的。

2c 4t,睿频1g~2.6g 三缓4mb,1151平台的话,大约是个电脑上的 赛扬g3900级别(1151没有比它更弱的了)

现在自己创建一个的Policy

public class MyUserPolicy : PooledObjectPolicy<User>//需要继承抽象类 { public override User Create() { return new User() { Age = 18, Name = "MicroHeart" }; } public override bool Return(User user) { if (user.Age == 18) return false; return true; } }

DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new MyUserPolicy(), 2); var firstUser=defaultPool.Get();//返回 Age=0 Name=null var user1 = new User() { Age = 18, Name = "MicroHeart" }; var user2 = new User() { Age = 19, Name = "MicroHeart" }; var user3 = new User() { Age = 20, Name = "MicroHeart" }; defaultPool.Return(user1); defaultPool.Return(user2); defaultPool.Return(user3); var u1 = defaultPool.Get();//返回user2 因为user1的Age=18,policy中Reture筛选条件 返回false,导致第一个user不能放入连接池中。 var u2 = defaultPool.Get();//返回user3 var u3 = defaultPool.Get();//返回 Age=18 Name=MicroHeart 这个是使用 Policy中的Create创建

三、源码解析

 IPooledObjectPolicy<T>:  主要作用是创建对象和将对象放入连接池中

  Create:定义一个创建对象的方法,当连接池中的数量不够取的时候,通过此方法创建对象。

  Return:将对象放入连接池中,如果放入成功,返回Ture.否则返回False.

  DefaultPooledObjectPolicy<T>:继承抽象类PooledObjectPolicy<T>,而抽抽象类继承接口 IPooledObjectPolicy<T>。Policy的默认实现类

    Create:定义一个默认创建对象的方法 new T();

    Return:不论是否放入连接池,全部返回True.

ObjectPoolProvider:创建对象池(ObjectPool)

  abstract ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy):通过Policy创建ObjectPool

  DefaultObjectPoolProvider:ObjectPoolProvider的默认实现类

    ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy) :创建一个可以容纳处理器数量X2的对象池。

ObjectPool<T>:对象池

  T Get():从对象池中获取对象。

  void Return(T obj):将对象放入对象池中。

  DefaultObjectPool:对象池的默认实现类,它实现了Get和Return方法。其实对象池的本质就是它的中的 ObjectWrapper[] _items; ,当使用Return方法是,将对象放入 ObjectWrapper数组中。Get方法从数组中取。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对真格学网的支持。

核心:对象中的数据损坏或已损坏内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • asp.net core如何添加统一模型验证处理机制详解
  • 解决uploadify使用时session发生丢失问题的方法
  • asp.net中各种类型的json格式化
  • asp.net signalr 让实时通讯变得如此简单
  • asp.net页面间数据传递的几种方法介绍
  • asp.net部署到iis常见问题的解决方法
  • asp.net socket客户端(远程发送和接收数据)
  • asp.net下ajax.ajaxmethod使用方法
  • visual studio 2017下asp.net core的taghelper智能提示解决办法
  • httprequest的querystring属性 的一点认识
  • Core:damaged or corrupted object data什么意思?
  • Error (10482): VHDL error at addsub
  • NET Core和.NET Standard有什么不同
  • 在.net Core中Migrate 和 EnsureCreated分别用于什么情形
  • Net 框架和.Net Core,我该用哪个?怎么选
  • Net 框架和.Net Core,我该用哪个?怎么选
  • intel酷睿i5系列中4210和5200哪个好?怎么比较?
  • BIOS中的CPU core ratio是什么意思
  • 酷睿m3 7y30相当于电脑中什么cpu
  • Net 框架和.Net Core,我该用哪个?怎么选
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧asp.net core如何添加统一模型验证处理机制详解解决uploadify使用时session发生丢失问题的方法asp.net中各种类型的json格式化asp.net signalr 让实时通讯变得如此简单asp.net页面间数据传递的几种方法介绍asp.net部署到iis常见问题的解决方法asp.net socket客户端(远程发送和接收数据)asp.net下ajax.ajaxmethod使用方法visual studio 2017下asp.net core的taghelper智能提示解决办法java正则表达式 pattern和matche未将对象引用设置到对象的实例 (asp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net汉字转拼音和获取汉字首字asp.net对路径"xxxxx"asp.net repeater 自递增asp.net mvc重写razorviewengine实现多主asp.net url重写简化版 速学url重写asp.net core集成kindeditor实现图片上传以ip来获取客户端电脑名称(一句代码实现)asp.net中基于soaphead的webservice安全机asp.net上传图片验证代码的小例子asp.net遍历目录文件夹和子目录所有文件发布一个基于tokyotyrant的c#客户端开源项asp.net core部署前期准备 使用hyper-v安
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved