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注解可以用在类上, 还可以用在普通方法上,还可以用在构造方法上,还可以 ...
随机推荐
- javascript闭包的应用
我印象中,javascript的闭包属于进阶的范畴,无非是用来在面试中装装逼而已.你看我身边的一个小伙子,有一天我装逼地问他什么是javascript的闭包,他居然连听都没听说过.但他做起前端的东西来 ...
- high-level operations on files and collections of files
11.10. shutil — High-level file operations — Python 3.6.5 documentation https://docs.python.org/3/li ...
- ios UIWebView 播放优酷土豆视频
将以下的代码嵌套在html里.然后webView载入这个网页.或这段html码,即可了,无须要使用像网上说的html5去兼容 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...
- POJ1182 食物链 —— 种类并查集
题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- 1.ARC模式下如何兼容非ARC的类
ARC模式下如何兼容非ARC的类 :转变为ARC的, -f-objc-arc 非ARC模式下如何兼容ARC的类 :转变为非ARC -fno-objc-arc
- 表单中的readOnly 和disabled
readonly和Disabled是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: disabled也可以禁用按钮和链接: <butt ...
- jdbc 分页
连接数据库 public class DbUtil { private String driver = "oracle.jdbc.OracleDriver"; private St ...
- windows server 2003 修改远程链接端口
服务器默认的远程链接的端口是3389,只能内网访问,外网不能访问,现映射了8400端口给服务器,内外网都可以访问,因此需要修改服务器的远程链接的端口. 运行中 输入:regedit 选择十进制,将33 ...
- 阿里DNS 223.5.5.5 223.6.6.6 (转载)
转自:http://it.oyksoft.com/post/6780/ 阿里DNS: 223.5.5.5 223.6.6.6 为何用它? 一.选择阿里DNS让你购物更爽,如果是淘宝狂人 ...
- 洛谷 P1251 餐巾计划问题【最小费用最大流】
建图细节比较多,对于每个点i,拆成i和i',i表示用的餐巾,i'表示脏餐巾,连接: (s,i,r[i],p)表示在这一天买新餐巾 (i,t,r[i],0)表示这一天用了r[i]的餐巾 (s,i+n,r ...