System.Lazy<T>延迟加载
在很多情况下,有些对象需要在使用时加载或根据逻辑动态加载。有些情况如果不延迟加载,可能会影响效率甚至抛出Timeout Exception。如网络操作、数据库操作、文件IO操作
直接上代码,方便我们理解怎么通过Lazy类实现对象的延迟加载。
class Program
{
static void Main(string[] args)
{
foreach (var item in Product.GetProductListLazy())
{
//下面的操作会执行Product类的构造函数
Product p = item.Value;
//构造函数执行完成
int id = item.Value.Id;
Console.WriteLine(id);
}
Console.ReadKey();
}
} public class Product
{
public int Id { set; get; }
public string Title { set; get; } public Product()
{
Thread.Sleep();
}
public static IList<Lazy<Product>> GetProductListLazy()
{
try
{
Console.WriteLine("非LazyLoad加载");
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff"));
Lazy<Product> product1 = new Lazy<Product>(() => new Product() { Id = , Title = "产品 1" });
Lazy<Product> product2 = new Lazy<Product>(() => new Product() { Id = , Title = "产品 2" });
Lazy<Product> product3 = new Lazy<Product>(() => new Product() { Id = , Title = "产品 3" });
return new List<Lazy<Product>> { product1, product2, product3 };
}
finally {
Console.WriteLine(DateTime.Now.ToString("HH:mm.ss.fff"));
}
} public static IList<Product> GetProductList()
{
try
{
Console.WriteLine("非LazyLoad加载");
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff"));
Product product1 = new Product() { Id = , Title = "产品 1" };
Product product2 = new Product() { Id = , Title = "产品 2" };
Product product3 = new Product() { Id = , Title = "产品 3" };
return new List<Product> { product1, product2, product3 };
}
finally {
Console.WriteLine(DateTime.Now.ToString("HH:mm.ss.fff"));
}
}
}
还有一种情况,我们知道多线程情况下的单件设计模式需要做数据同步的:
public class Singleton
{
private static Singleton _Instance = new Singleton(); public static Singleton GetInstance()
{
return _Instance;
}
}
这样可以保证多线程的情况下,只有一个实例,因为是在程序加载时,初始化的对象,但是也正因为这样,失去了单件的一个优势,按需加载。
所以,我们可以这样实现:
public class SingletonLazy
{
private static Lazy<SingletonLazy> _Instance = new Lazy<SingletonLazy>(); public static SingletonLazy GetInstance()
{
return _Instance.Value;
}
}
这样的话,可以保证有一个实例,同时实现延迟加载,按需加载。
以上内容介绍完了,欢迎大家交流和指正
另附:
参考文章:http://www.codeproject.com/Articles/612801/Lazy-Object-Initialization-with-System-Lazy-of-T-c
Demo下载:http://files.cnblogs.com/wpfworld/LazyLoadDemo.rar
System.Lazy<T>延迟加载的更多相关文章
- Lazy Load, 延迟加载图片的 jQuery 插件 - NeoEase
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- Lazy Load, 延迟加载图片的 jQuery 插件.
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...
- Hibernate lazy(延迟加载)
Hibernat加载策略有两种,分别为即时加载和延迟加载(懒加载或者lazy),get使用的是即时加载,使用get获取数据时会立即查找(会先去缓存查找,如果缓存中没有找到,才会去数据库中查找),而lo ...
- RabbitMQ Lazy Queue 延迟加载
Lazy Queue 在著名的单例设计模式中就有懒汉式的实现方式,也就是只有在你需要的时候我才去加载. 这让博主想到了以前上学的时候,每到了假期的假期作业,在假期的时候是从来不做的.只有在快开学老师要 ...
- Lazy Load, 延迟加载图片的 jQuery 插件【备忘】
http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/ jQuery Unveil – 另一款非常轻量的延迟加载插件 http ...
- Lazy<T> 延迟加载
namespace ConsoleAppTest { class Program { static void Main(string[] args) { Lazy<Student> stu ...
- .Net Framework 4.0: Using System.Lazy<T>
原文发布时间为:2011-04-26 -- 来源于本人的百度文章 [由搬家工具导入] http://weblogs.asp.net/gunnarpeipman/archive/2009/05/19/n ...
- java:Hibernate框架4(延迟加载(lazy),抓取(fetch),一级缓存,get,load,list,iterate,clear,evict,flush,二级缓存,注解,乐观锁和悲观锁,两者的比较)
1.延时加载和抓取: hibernate.cfg.xml: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-co ...
- AutoWired注解和Lazy延迟加载
一.代码截图: @Lazy是延迟加载的意思, 容器启动时不创建对象, 当从容器中需要获取此对象时才创建. @Lazy//@Lazy注解可以用在类上, 还可以用在普通方法上,还可以用在构造方法上,还可以 ...
随机推荐
- Cordova打包vue项目(Android)
准备工作: 安装好必要环境: vue-cli,webpack,node.js,android环境 (http://cordova.axuer.com/docs/zh-cn/latest/guide/p ...
- HBase使用教程
1 基本介绍 1.1 前言 HBase – Hadoop Database.是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigta ...
- nextLine() 、nextInt()的跳过问题
nextInt() 将输入的信息的下一个标记扫描为 int. nextLine() 此扫描器执行当前行,并返回跳过的输入信息. nextInt 会读取下面输入的 int类型的信息以回车作为结束,如果 ...
- HDU1087 Super Jumping! Jumping! Jumping! —— DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1087 Super Jumping! Jumping! Jumping! Time Limi ...
- eclipse自动创建项目出错Cannot change version of project facet Dynamic Web Module to 2.3.
Cannot change version of project facet Dynamic Web Module to 2.3. step1:修改properties step2:修改web.xml ...
- java中字节数组byte[]和字符(字符串)之间的转换
转自:http://blog.csdn.net/linlzk/article/details/6566124 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成by ...
- ruby gem的安装步骤
第一步:下载安装文件 官网下载地址:http://rubyinstaller.org/downloads 第二步: 双击安装 在安装的时候,请勾选Add Ruby executables to you ...
- UI:简单的SQL语句
一.SQL语句如果要在程序运行过程中操作数据库中的数据,那得先学会使用SQL语句1.什么是SQLSQL(structured query language):结构化查询语言SQL是一种对关系型数据库中 ...
- bzoj 2157: 旅游【树链剖分+线段树】
裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...
- 洛谷 P3622 [APIO2007]动物园【状压dp】
看成网络流建图想了好久... 实际上5个是可以状压的 设f[i][k]为到第i个围栏状态为k的方案数,因为考虑到重复,设g[i][k]记录i开始,状态为k的孩子有几个 状态转移很好想:f[j][k]= ...