我有以下方法在漂亮的网页上显示IIS工作者请求,但是每次刷新页面时,都会增加目标计算机上dllhost(COM Surrogate)的内存消耗,直到没有更多可用内存为止。 我是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++;
}
}
}
答案 0 :(得分:0)
第一部分(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 / IIS版本,似乎有一个已知错误可能无法修复。请参阅此处,例如使用并报告错误:https://connect.microsoft.com/VisualStudio/feedback/details/722272/microsoft-web-administration-servermanager-memory-leak