C# 如何保證對象線程內唯一:數據槽(CallContext)


   如果說,一個對象保證全局唯一,大家肯定會想到一個經典的設計模式:單例模式,如果要使用的對象必須是線程內唯一的呢?

  數據槽:CallContext,ok看下msdn對callcontent的解釋。

  

CallContext 是類似於方法調用的線程本地存儲區的專用集合對象,並提供對每個邏輯執行線程都唯一的數據槽。數據槽不在其他邏輯線程上的調用上下文之間共享。當 CallContext 沿執行代碼路徑往返傳播並且由該路徑中的各個對象檢查時,可將對象添加到其中。

 

  也就是說,當前線程對對象進行儲存到線程本地儲存區,對象隨着線程的銷毀而銷毀。

  使用代碼:

  static string key = "DbContext-Single";
        public static System.Data.Entity.DbContext Instance
        {
            get
            {
                DbContext temp = CallContext.GetData(key) as DbContext;

                if (temp == null)
                {
                    temp = new HelperModelContainer();
                    //放入數據槽中
                    CallContext.SetData(key, temp);
                }
                return temp;
            }
            private set { }
        }

   使用場景:我個人認為,當對象需要線程內全局使用,而其他線程包擴子線程都不能訪問的時候使用。比如EF的數據上下午,每次請求都會生成一個線程處理請求,這時候創建一個數據上下文對象給不同的函數使用,最后一起提交就完全可以避免事務的問題。當然也許有人會問我可以創建一個變量來使用,同樣可以達到一樣的目的,這當然也是可以的,只是這個對象你也是可以和其他線程數據進行交互的,這就違背了線程內唯一的概念了。

  以上僅表示個人觀點,理解不對的,歡迎大家指點,謝謝!!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM