为什么静态变量在ASP.NET中没有按预期工作?

时间:2014-09-25 05:22:09

标签: c# asp.net static garbage-collection

我在其中构建了一个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()
    {
    }

1 个答案:

答案 0 :(得分:4)

而不是垃圾收集器问题(正如你的问题中的评论所指出的那样,你应该发现Eric Lippert是一个很好的资源!),它可能是Internet Information Services应用程序池的问题&# 39;回收。

默认应用程序池设置将在一些空闲时间后强制回收。此外,如果存在可能导致IIS工作进程死亡的致命错误(如堆栈溢出),则应用程序池可能会停止运行。其他情况可能是极端的内存泄漏。

总结:

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