在Session中保存类的对象引用还是声明为static?

时间:2013-07-18 21:05:42

标签: c# asp.net session

我们说我有一个这样的课程:

class Test{

   private string status;

   public Test(){

      //Do some processing. After processing is done assign

    status = "processdone_uniqueidhere";

      }    
}

现在,在我的asp.net应用程序中,我需要在处理完成后使用计时器定期检查状态。

基本上,我可以在会话中存储类“Test”的引用,例如:

Test t = new Test();
Session["uniquesession"] = (Test)t;

在计时器中,我可以从会话中检索类的实例并检查状态值:

Test t = (Test)Session["uniquesession"];

string value = t.status;

即使我将类声明为[Serializable],我也无法将引用存储在ViewState中。不知道为什么。适用于会话。

另一种方法是将类声明为static并将变量status声明为static和public,并检查值如下:

string value = Test.status;

哪种方式最稳定,哪种方式不好?

2 个答案:

答案 0 :(得分:0)

如果这是特定于当前用户的,请使用Session。

如果它是全局的,请使用Cache或静态成员。

答案 1 :(得分:0)

你这是错误的方式。如果需要共享它应该是静态的,并且它不应该存储在会话中。该会话用于维护每个用户的状态的易失性信息,而不是用户之间共享的内容。更重要的是,如果您进入进程外会话,您的课程将被定期序列化和反序列化,这可能会重置或弄乱您的计时器。更不用说会议到期时,课程已经消失。

让它变得静止,但更重要的是,要长时间地思考这个课程的目标是什么,以及它为什么需要存在。将瞬态,易变数据放在Session中,而不是带有逻辑的类。