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的數據上下文,每次請求都會生成一個線程處理請求,這時候創建一個數據上下文對象給不同的函數使用,最後一起提交就完全可以避免事務的問題。當然也許有人會問我可以創建一個變量來使用,同樣可以達到一樣的目的,這當然也是可以的,只是這個對象你也是可以和其他線程數據進行交互的,這就違背了線程內唯一的概念了。

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