zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    git切换到指定分支,git新建分支与合并
    别克英朗更换空调滤网与发动机空气滤网
    杭州市浙A区域号牌正则表达式
    新史记·特斯拉怒怼民女传
    史记 袁隆平传
    抵押贷款国五车辆,非浙A(外地)转浙A(摇号),本人名下电子转籍流程
    // TPLINK WR882N/TL-WR842N管理脚本
    netsh用法
    百度AI车号牌照片识别
    .htaccess 301重定向 http https 多域名
  • 原文地址:https://www.cnblogs.com/wpfworld/p/3181014.html
Copyright © 2011-2022 走看看