C# 是否在会话中保存类的对象引用或声明为静态?
假设我有这样一门课:C# 是否在会话中保存类的对象引用或声明为静态?,c#,asp.net,session,C#,Asp.net,Session,假设我有这样一门课: class Test{ private string status; public Test(){ //Do some processing. After processing is done assign status = "processdone_uniqueidhere"; } } string value = Test.status; 现在,在我的asp.net应用程序中,我需要在处理完成时使用计时器
class Test{
private string status;
public Test(){
//Do some processing. After processing is done assign
status = "processdone_uniqueidhere";
}
}
string value = Test.status;
现在,在我的asp.net应用程序中,我需要在处理完成时使用计时器定期检查状态以获取值
基本上,我可以在会话中存储类“Test”的引用,例如:
Test t = new Test();
Session["uniquesession"] = (Test)t;
在计时器中,我可以从会话中检索类的实例,并检查status的值:
Test t = (Test)Session["uniquesession"];
string value = t.status;
即使我将类声明为[Serializable],我也无法将引用存储在ViewState中。不知道为什么。不过,它可以与会话一起工作
另一种方法是将类声明为static,将变量status声明为static和public,并检查如下值:
class Test{
private string status;
public Test(){
//Do some processing. After processing is done assign
status = "processdone_uniqueidhere";
}
}
string value = Test.status;
哪种方式最稳定,哪种方式不好?如果这是针对当前用户的,请使用会话
如果是全局的,请使用缓存或静态成员。这样做是错误的。如果需要共享,它应该是静态的,不应该存储在会话中。会话用于维护每个用户的状态的易失性信息,而不是跨用户共享的内容。更重要的是,如果您移动到进程外会话,您的类将定期进行序列化和反序列化,这可能会重置或弄乱计时器。更不用说当会话过期时,类就消失了
让它成为静态的,但更重要的是,仔细思考课程的目标是什么,以及为什么它需要存在。将瞬态、易失性数据放在会话中,而不是逻辑类中。如果要在所有请求中共享对象,请将其设置为静态,但我强烈建议将其放在
会话中。如果你想在所有用户之间共享它,你也可以使用缓存
。将它们全部存储在会话中会损害我的可伸缩性,并占用大量服务器资源。不需要跨用户共享。它是基于每个用户的。如果是基于每个用户的,是否仍然可以执行静态操作?不,静态是一个共享实例。如果每个用户都需要一些东西,会话可能是一个不错的选择,但计时器之类的东西会让你觉得很棘手。它是针对当前用户的。使用静态变量是错误的吗?@Dimo:那么使用缓存或静态变量是错误的。使用会话或数据库。