System.Lazy<T>延迟加载 在很多情况下,有些对象需要在使用时加载或根据逻辑动态加载。有些情况如果不延迟加载,可能会影响效率甚至抛出Timeout Exception。如网络操作、数据库操
2017-05-31 20:18
1141 查看
System.Lazy<T>延迟加载
在很多情况下,有些对象需要在使用时加载或根据逻辑动态加载。有些情况如果不延迟加载,可能会影响效率甚至抛出Timeout Exception。如网络操作、数据库操作、文件IO操作
直接上代码,方便我们理解怎么通过Lazy类实现对象的延迟加载。
还有一种情况,我们知道多线程情况下的单件设计模式需要做数据同步的:
这样可以保证多线程的情况下,只有一个实例,因为是在程序加载时,初始化的对象,但是也正因为这样,失去了单件的一个优势,按需加载。
所以,我们可以这样实现:
这样的话,可以保证有一个实例,同时实现延迟加载,按需加载。
以上内容介绍完了,欢迎大家交流和指正
另附:
参考文章:http://www.codeproject.com/Articles/612801/Lazy-Object-Initialization-with-System-Lazy-of-T-c
Demo下载:http://files.cnblogs.com/wpfworld/LazyLoadDemo.rar
在很多情况下,有些对象需要在使用时加载或根据逻辑动态加载。有些情况如果不延迟加载,可能会影响效率甚至抛出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(5000); } 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 = 1, Title = "产品 1" }); Lazy<Product> product2 = new Lazy<Product>(() => new Product() { Id = 2, Title = "产品 2" }); Lazy<Product> product3 = new Lazy<Product>(() => new Product() { Id = 3, 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 = 1, Title = "产品 1" }; Product product2 = new Product() { Id = 1, Title = "产品 2" }; Product product3 = new Product() { Id = 1, 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
相关文章推荐
- .NET泛型04,使用Lazy<T>实现延迟加载
- 使用Lazy<T>实现对客户订单的延迟加载
- 【翻译】使用Lazy<T>和抽象包装类延迟加载复杂的系统参数
- System.Web.HttpException (0x80004005): 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。
- System.Lazy<T>延迟加载
- C# 基础概念之延迟加载 Lazy<T>
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate
- 使用泛型 类型“System.Collections.Generic.IEnumerator<T>”需要 1 个类型参数
- Lazy<T>的应用之类内部字段与C#延迟加载
- 多个线程可能会试图同时访问某个对象。在多个线程同时争相访问某个对象的同时,如果一个线程修改了资源,有些线程可能会收到无效状态。例如,如果某个线程读取对象的字段,同时另一线程正在修改该字段,则第一个线程可能会收到无效的字段状态。这种情况称为竞用情况。
- : 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。 ---> System.BadImageFormatException: 试图加载格式不正确的程序。
- 验证视图MAC失败。如果此引用程序由网络场或群集承载,请确保<machineKey>配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerateP>
- #include <afxinet.h>在Release情况下,如果使用静态Lib,会报错
- js给<object>视频赋值 延迟加载,解决不能修改的html对象的问题 .
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate
- 您希望通过将所有ArrayList对象替换为相应的泛型版本以提高应用程序的效率,并使得代码更易于使用。当结构体或其他值类型存储在这些数据结构中时,会导致装箱/拆箱操作,这时就需要这么做。
- 使用 .NET 4.0 中的Lazy<T> 实现延迟初始化
- Java中使用hql,sql查询返回的list<Object> 转成需要的实体对象--方法讲解!
- 使用Map把sql返回的list<Object>转成需要的实体对象