为什么不';t静态变量在ASP.NET中正常工作

本文关键字:常工作 工作 NET ASP 静态 变量 为什么不 | 更新日期: 2023-09-27 18:24:16

我构建了一个ASP.NET应用程序和其中的public static变量:

public static WebEndPointFlow[] EndPoints = new WebEndPointFlow[10];

其中WebEndPointFlow是我的自定义类
问题是:当我设置EndPoints数组的某个元素时,它只能持续很短的时间。几分钟后,元素变为null
我不知道数组中的元素会发生什么。所以我创建了一个死线程来定期访问这些元素,希望GC不会处理它们。真可怜,它不起作用
关于如何始终保持我的原始元素,有什么想法吗?非常感谢!

======================================
那么这个问题与GC无关?我同意
但是为什么我的元素变为空呢?

===========================
还有一个问题:当不同的用户访问这个数组时,它看起来是一样的吗?
分类代码:

public class WebEndPointFlow
    {
    private static readonly ILog logger = LogManager.GetLogger(typeof(WebEndPointFlow));
    private InstantMessagingFlow flow;
    public InstantMessagingFlow Flow
    {
        get { return flow; }
    }
    private UserEndpointSettings userEndpointSettings;
    private UserEndpoint endPoint;
    public UserEndpoint EndPoint
    {
        get { return endPoint; }
        set { endPoint = value; }
    }
    public StringBuilder Transcript { get; set; }
    private WebSocketServer wsServer;
    private Conversation conversation;
    // position in the array of 'endPoints'
    private int position;
    public int Position
    {
        get { return position; }
        set { position = value; }
    }
    private FailureResponseException e = null;
    private string _TargetLyncUser;
    public string TargetLyncUser
    {
        get { return _TargetLyncUser; }
        set { _TargetLyncUser = value; }
    }
    private bool sendTrans = false;
    public int Duration
    {
        get;
        set;
    }
    public WebEndPointFlow()
    {
    }

为什么不';t静态变量在ASP.NET中正常工作

与其说是垃圾收集器问题(正如您的问题中的评论所指出的,而且您无论如何都应该找到Eric Lippert一个好的来源!),不如说是Internet Information Services应用程序池的回收问题。

默认的应用程序池设置将在一段空闲时间后强制回收。此外,如果出现致命错误(如堆栈溢出),则应用程序池可能会关闭,该错误可能会终止IIS工作进程。其他情况可能是内存极度泄漏。

总结:

  • 转到应用程序的应用程序池设置,并尝试增加空闲时间:(注意:您不应该永久设置此设置:我建议您这样做是为了调试目的,以便让您了解应用程序池模型是如何工作的
  • Global.asax中添加一个Application_Error处理程序,并在那里记录异常,看看一段时间后是否出现问题