程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> CallContext的LogicalCallContext在多線程環境下面公用變量,多線程局部變量

CallContext的LogicalCallContext在多線程環境下面公用變量,多線程局部變量

編輯:C#入門知識

CallContext的LogicalCallContext在多線程環境下面公用變量,多線程局部變量


壓根名聽說過這個類的看這裡:如何實現對上下文(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。"

這裡應該是說只管傳遞過去,不管引用關系了,類似“值傳遞”吧。

 

歡迎大神斧正。。。


getContext()方法是獲取上下文變量的? 怎使用? 直接Context context = getContext(); ? 我

java中的函數其實是一大堆封裝好的代碼(那些代碼往往常常會被用到,所以封裝成一個簡單的函數供你調用),調用函數的過程就是執行那些代碼的過程,另外搭建在手機上,pda上的java平台,一般是將你的java程序通過平台解析成那種操作系統可以運行的程序,java程序就像黃金,直接用來買東西是不行的,而java的解析器就像是銀行,你將黃金到銀行換成錢就能用了,而操作系統就像國家,你可以把黃金換成美元,人民幣,歐元.......然後在各個地方使用,java也一樣,解析器在不同的環境下將你的java編譯成不同的程序從而實現跨平台這一功能,但是xxMFC就不能和java一樣了,往往只能在windows下使用,就像人民幣在美國不能直接買東西是同一個道理
 

ActionContextgetContext()的幾種用法

ActionContext.getContext().getSession() 獲取的是session,然後用put存入相應的值,只要在session有效狀態下,這個值一直可用

ActionContext.getContext().put("x", x) 默認的是request,在這個request未結束之前都是可用的

ActionContext.getContext().getValueStack().push(x),在Struts2中,一個請求在最終到達Action的方法之前,Action對象本身會被壓入ValueStack,可以把一個對象直接壓入到valuestack中
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved