壓根名聽(tīng)說(shuō)過(guò)這個(gè)類(lèi)的看這里:如何實(shí)現(xiàn)對(duì)上下文(Context)數(shù)據(jù)的統(tǒng)一管理
原來(lái)以為CallContext就可以直接在多線(xiàn)程環(huán)境下面共享使用的,今天突然想到:asp.net環(huán)境下面,設(shè)置來(lái)設(shè)置去的,對(duì)象不就被多個(gè)客戶(hù)端搞亂了嗎?
隨做了以下代碼測(cè)試:
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(); }
結(jié)果是這個(gè)鳥(niǎo)樣子:
看來(lái)是我想多了啊,汗。。。
摘抄一段官方點(diǎn)的說(shuō)明(來(lái)自artech大神的博客):
LogicalCallContext:LogicalCallContext 類(lèi)是在對(duì)遠(yuǎn)程應(yīng)用程序域進(jìn)行方法調(diào)用時(shí)使用的 CallContext 類(lèi)的一個(gè)版本。CallContext 是類(lèi)似于方法調(diào)用的線(xiàn)程本地存儲(chǔ)的專(zhuān)用集合對(duì)象,并提供對(duì)每個(gè)邏輯執(zhí)行線(xiàn)程都唯一的數(shù)據(jù)槽。數(shù)據(jù)槽不在其他邏輯線(xiàn)程上的調(diào)用上下文之間共享。當(dāng) CallContext 沿執(zhí)行代碼路徑往返傳播并且由該路徑中的各個(gè)對(duì)象檢查時(shí),可將對(duì)象添加到其中。當(dāng)對(duì)另一個(gè) AppDomain 中的對(duì)象進(jìn)行遠(yuǎn)程方法調(diào)用時(shí),CallContext 類(lèi)將生成一個(gè)與該遠(yuǎn)程調(diào)用一起傳播的 LogicalCallContext。只有公開(kāi) ILogicalThreadAffinative 接口并存儲(chǔ)在 CallContext 中的對(duì)象被在 LogicalCallContext 中傳播到 AppDomain 外部。不支持此接口的對(duì)象不在 LogicalCallContext 實(shí)例中與遠(yuǎn)程方法調(diào)用一起傳輸。
"CallContext 類(lèi)將生成一個(gè)與該遠(yuǎn)程調(diào)用一起傳播的 LogicalCallContext。"
這里應(yīng)該是說(shuō)只管傳遞過(guò)去,不管引用關(guān)系了,類(lèi)似“值傳遞”吧。
歡迎大神斧正。。。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注