正在会话中保存类的对象引用或声明为静态

本文关键字:对象引用 声明 静态 会话 保存 | 更新日期: 2023-09-27 18:23:54

假设我有一个这样的类:

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中。不知道为什么。不过可以与会话配合使用。

另一种方法是将类声明为静态,将变量状态声明为静态和公共,并检查如下值:

string value = Test.status;

哪种方式最稳定,哪种方式是不好的做法?

正在会话中保存类的对象引用或声明为静态

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

如果是全局成员,请使用缓存或静态成员。

你的做法不对。如果需要共享,它应该是静态的,并且不应该存储在会话中。会话用于维护每个用户状态的易失性信息,而不是用于跨用户共享的内容。更重要的是,如果您转移到进程外会话,您的类将定期进行序列化和反序列化,这可能会重置或干扰计时器。更不用说当课程结束时,课程就结束了。

让它静止,但更重要的是,仔细思考这个类的目标是什么,以及为什么它需要存在。将瞬态、易失性数据放入会话中,而不是使用逻辑的类。