正在会话中保存类的对象引用或声明为静态
本文关键字:对象引用 声明 静态 会话 保存 | 更新日期: 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。
如果是全局成员,请使用缓存或静态成员。
你的做法不对。如果需要共享,它应该是静态的,并且不应该存储在会话中。会话用于维护每个用户状态的易失性信息,而不是用于跨用户共享的内容。更重要的是,如果您转移到进程外会话,您的类将定期进行序列化和反序列化,这可能会重置或干扰计时器。更不用说当课程结束时,课程就结束了。
让它静止,但更重要的是,仔细思考这个类的目标是什么,以及为什么它需要存在。将瞬态、易失性数据放入会话中,而不是使用逻辑的类。