2013-01-04 150 views
2

我想知道在.NET環境中是否有有效的會話或靜態。 我需要的是一個變量,用於存儲一些保存其值的數據,可通過所有ASP.NET頁面/ C#表格訪問,但對於使用應用程序的所有用戶不是唯一的。替代會話/靜態變量ASP.NET/C#

+4

你甚至Google和會話搜索嗎?看:http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx – Pleun

+0

C#窗體= winforms? –

+0

是的,我搜索到網絡,但我沒有找到我所需要的。也許我沒有用正確的話。是的,我主要使用Windows Forms應用程序的C#。 –

回答

2

然後你的答案很可能是Application Cache。看看System.Web.Caching

由於關於緩存對象的生存期有一些討論,您可以設置它。用戶不是特定的,但是這需要多長時間。應用程序回收之間?在單個實例的生命週期中,它是否需要在實例之間。緩存將適用於最簡單的要求。

+1

這不能保證它的價值,是嗎? – Pleun

+1

對於應用程序的生命週期。默認情況下它不會在實例間工作。 –

+0

應用程序緩存保持其值,除非您已將其設置爲過期(滑動或絕對),或者應用程序重新啓動,或者通過某種其他機制刪除緩存項。 – hnafar

1

你可以使用應用程序緩存嗎?它爲整個應用程序中的所有用戶所共享,可從所有頁面訪問,而不是每個用戶唯一。

請參閱thisthis有關如何使用緩存API

+0

如果您需要在應用程序實例的生命週期之外維護這些值,則可能不得不求助於持久性數據存儲,而不是會話,緩存等,即file或db。 – hnafar

+0

不是會話。您可以輕鬆地將會話提供程序配置爲使用持久性存儲。混合蘋果和香蕉;) –

0

您可能會暴露一個類爲靜態的更多細節。這將使其在所有會話中都可用,但僅限於該應用程序實例。

+0

-1,因爲這基本上描述了一個反模式 –

+0

這是你的先知,並隨時這樣做。我自己的個人標準是,降薪可能適用於不明確或無用的答案,而不是因爲方法上的個人偏好 - 而且在一天結束時,模式只是另一種工具(根據我自己的經驗常常被濫用),以根據情況上班或不上班。具體到OP的情況,Static類將涵蓋他的需求,並且具有最少數量的「移動部分」 - 因此是有用的。 – OnoSendai

1

您可以嘗試使用應用程序範圍的變量來處理此問題。

首先在Global.asax文件,添加以下內容:

void Application_Start(object sender, EventArgs e) 
{ 
    [Other Stuff Already Here Omitted] 
    Application["MyVariable"] = "My Default value"; 
} 

然後任何頁面上,你可以訪問此:

var myVar = Application["MyVariable"]; 
2

我認爲你正在尋找應用程序狀態,而比應用程序緩存。 應用程序狀態的工作方式與會話狀態相同,但會在所有會話之間共享。

使用範例:

Application["Message"] = "Welcome to my Website"; 

的更多信息: http://www.codeproject.com/Articles/87316/A-walkthrough-to-Application-State

+0

不回答這個問題,因爲op特別提到winforms –

+1

這個問題提到ASP.NET,它上面也有ASP.NET標籤 –

+0

是的,你的答案是正確的。然而,op提到了c#表單,可能是winforms。 Win表單無權訪問您描述的工具集 –

0

答案是否定的。該級別上不存在「.Net環境」。您的.Net代碼也會從主機獲取運行時限制。 讓我們定義兩個主機(還有更多): IIS和「簡單的主要exe」。

對於IIS託管代碼,您正在主機創建線程(或分配一個線程)並在此線程上執行代碼的環境中運行。主機本身定義何時以及是否重置該過程。你不能或者不應該假設任何關於哪個進程或線程正在執行你的代碼。當你在農場中談論iis時,這會得到增強。

對於exe中的簡單主代碼,操作系統創建進程和初始第一個線程,並將執行指針設置爲主函數中的第一個語句。

「靜態」在擁有過程的整個生命週期內保持狀態,這是.Net給您的保證。

「會話」是特定的實現來處理遠遠超過靜態屬性。

我會建議你也描述你的主機的問題的細化。對於iis,答案可能是AppFabric緩存。

希望這可以幫助