壓根名聽說過這個類的看這里:如何實現對上下文(Context)數據的統一管理
原來以為CallContext就可以直接在多線程環境下面共享使用的,今天突然想到:asp.net環境下面,設置來設置去的,對象不就被多個客戶端搞亂了嗎?
隨做了以下代碼測試:
static void Main(string[] args) { CallContext.LogicalSetData("key", "1"); Thread trd = new Thread(new ThreadStart(() => { Console.WriteLine("first thread : " + CallContext.LogicalGetData("key")); Thread.Sleep(1000); Console.WriteLine("first thread : " + CallContext.LogicalGetData("key")); })); trd.Start(); Thread.Sleep(100); CallContext.LogicalSetData("key", "2"); Thread trd1 = new Thread(new ThreadStart(() => { Console.WriteLine("second thread : " + CallContext.LogicalGetData("key")); })); trd1.Start(); Console.Read(); }
結果是這個鳥樣子:
看來是我想多了啊,汗。。。
摘抄一段官方點的說明(來自artech大神的博客):
LogicalCallContext:LogicalCallContext 類是在對遠程應用程序域進行方法調用時使用的 CallContext 類的一個版本。CallContext 是類似于方法調用的線程本地存儲的專用集合對象,并提供對每個邏輯執行線程都唯一的數據槽。數據槽不在其他邏輯線程上的調用上下文之間共享。當 CallContext 沿執行代碼路徑往返傳播并且由該路徑中的各個對象檢查時,可將對象添加到其中。當對另一個 AppDomain 中的對象進行遠程方法調用時,CallContext 類將生成一個與該遠程調用一起傳播的 LogicalCallContext。只有公開 ILogicalThreadAffinative 接口并存儲在 CallContext 中的對象被在 LogicalCallContext 中傳播到 AppDomain 外部。不支持此接口的對象不在 LogicalCallContext 實例中與遠程方法調用一起傳輸。
"CallContext 類將生成一個與該遠程調用一起傳播的 LogicalCallContext。"
這里應該是說只管傳遞過去,不管引用關系了,類似“值傳遞”吧。
歡迎大神斧正。。。
新聞熱點
疑難解答