System.Lazy延遲加載 在很多情況下,有些對象需要在使用時加載或根據邏輯動態加載。有些情況如果不延遲加載,可能會影響效率甚至拋出Timeout Exception。如網絡操作、數據庫操

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章