System.Lazy<T>延迟加载 在很多情况下,有些对象需要在使用时加载或根据逻辑动态加载。有些情况如果不延迟加载,可能会影响效率甚至抛出Timeout Exception。如网络操作、数据库操

本文探讨了在Android开发中如何利用System.Lazy<T>实现对象的延迟加载,以提高效率并避免在网络、数据库操作或文件IO时抛出Timeout Exception。通过示例代码展示了如何在多线程环境下应用Lazy实现线程安全的单例模式,并提供了一个参考文章链接和Demo下载地址。
摘要由CSDN通过智能技术生成
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(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值