Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否在会话中保存类的对象引用或声明为静态?_C#_Asp.net_Session - Fatal编程技术网

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:那么使用缓存或静态变量是错误的。使用会话或数据库。