如果說,一個對象保證全局唯一,大家肯定會想到一個經典的設計模式:單例模式,如果要使用的對象必須是線程內唯一的呢?
數據槽: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的數據上下午,每次請求都會生成一個線程處理請求,這時候創建一個數據上下文對象給不同的函數使用,最后一起提交就完全可以避免事務的問題。當然也許有人會問我可以創建一個變量來使用,同樣可以達到一樣的目的,這當然也是可以的,只是這個對象你也是可以和其他線程數據進行交互的,這就違背了線程內唯一的概念了。
以上僅表示個人觀點,理解不對的,歡迎大家指點,謝謝!!!!!