c# Remote ServerManager & COM Surrogate 足迹



我有以下方法,它在漂亮的网页上显示IIS工作程序请求,但每次刷新页面时,都会增加目标计算机上dllhost(COM代理)的内存消耗,直到没有更多可用内存为止。当谈到C#时,我是一个初学者,所以我希望有人能向我解释如何更改这些代码,以在每次刷新时释放目标服务器上的内存占用?

protected void Page_Load(object sender, EventArgs e)
{
    manager = ServerManager.OpenRemote("Lonappu01032");
    int filtered = Convert.ToInt32(Request.QueryString["filter"]);
    StringBuilder sb = new StringBuilder();
    foreach (WorkerProcess proc in manager.WorkerProcesses)
    {
        RequestCollection rc = proc.GetRequests(0);
        var selected = from r in rc
                       select r;
         if (filtered>0)
         {
             selected  = from r in rc
                                  where r.SiteId == filtered
                                  select r;
         }

        foreach (Request r in selected)
        {
            sb.AppendFormat("<tr><td><a href="?filter={8}">{8}</a></td><td>{0}</td><td>{1}</td><td>{2}</td><td><img src="http://mobilust.net/onlines/iptoflag.aspx?ip={3}" alt="{3}" /> {3}</td><td>{4} ({5}s)</td><td>{6}</td><td>{7}</td></tr>", r.HostName, Server.HtmlEncode(r.Url), r.Verb, r.ClientIPAddr, r.PipelineState, TimeSpan.FromMilliseconds(r.TimeInState).TotalSeconds, r.CurrentModule, TimeSpan.FromMilliseconds(r.TimeElapsed).TotalSeconds, r.SiteId);
            RequestCount++;
        }
    }
}

第一部分(C#中的一般良好实践)

在.NET中,当使用实现IDisposable的类时,请使用"using"子句。这样做可以确保在完成后调用dispose方法。碰巧ServerManager类实现了IDisposable,真是太好了。就其本身而言,"应该"就足够了。

所以像下面这样实现"使用",它可能会解决你的问题:

protected void Page_Load(object sender, EventArgs e)
{
    using (var manager = ServerManager.OpenRemote("Lonappu01032"))
    {
        int filtered = Convert.ToInt32(Request.QueryString["filter"]);
        StringBuilder sb = new StringBuilder();
        foreach (WorkerProcess proc in manager.WorkerProcesses)
        {
            //your foreach remains unchanged
        }
    }
}

第二部分(总有一个但是)

然而,似乎有一个已知的错误,可能无法修复,具体取决于您使用的windows/IIIS版本。有关使用和报告的错误的示例,请参见此处:https://connect.microsoft.com/VisualStudio/feedback/details/722272/microsoft-web-administration-servermanager-memory-leak

最新更新