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