壓根名聽說過這個類的看這裡:如何實現對上下文(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。"
這裡應該是說只管傳遞過去,不管引用關系了,類似“值傳遞”吧。
歡迎大神斧正。。。
java中的函數其實是一大堆封裝好的代碼(那些代碼往往常常會被用到,所以封裝成一個簡單的函數供你調用),調用函數的過程就是執行那些代碼的過程,另外搭建在手機上,pda上的java平台,一般是將你的java程序通過平台解析成那種操作系統可以運行的程序,java程序就像黃金,直接用來買東西是不行的,而java的解析器就像是銀行,你將黃金到銀行換成錢就能用了,而操作系統就像國家,你可以把黃金換成美元,人民幣,歐元.......然後在各個地方使用,java也一樣,解析器在不同的環境下將你的java編譯成不同的程序從而實現跨平台這一功能,但是xxMFC就不能和java一樣了,往往只能在windows下使用,就像人民幣在美國不能直接買東西是同一個道理
ActionContext.getContext().getSession() 獲取的是session,然後用put存入相應的值,只要在session有效狀態下,這個值一直可用
ActionContext.getContext().put("x", x) 默認的是request,在這個request未結束之前都是可用的
ActionContext.getContext().getValueStack().push(x),在Struts2中,一個請求在最終到達Action的方法之前,Action對象本身會被壓入ValueStack,可以把一個對象直接壓入到valuestack中