我们说我有一个这样的课程:
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;
哪种方式最稳定,哪种方式不好?
答案 0 :(得分:0)
如果这是特定于当前用户的,请使用Session。
如果它是全局的,请使用Cache或静态成员。
答案 1 :(得分:0)
你这是错误的方式。如果需要共享它应该是静态的,并且它不应该存储在会话中。该会话用于维护每个用户的状态的易失性信息,而不是用户之间共享的内容。更重要的是,如果您进入进程外会话,您的课程将被定期序列化和反序列化,这可能会重置或弄乱您的计时器。更不用说会议到期时,课程已经消失。
让它变得静止,但更重要的是,要长时间地思考这个课程的目标是什么,以及它为什么需要存在。将瞬态,易变数据放在Session中,而不是带有逻辑的类。