【问题标题】:w3wp eating up memory and not giving it backw3wp 吃掉内存而不是还给它
【发布时间】:2017-01-18 16:53:16
【问题描述】:

我在 .net 4.6.1 中有一个经典的 asp.net 页面。 它加载了 4 MB 的数据(他们希望它在一页上),无论我如何简化它,IIS 工作进程 w3wp.exe 都会消耗大量数据,并且永远不会过期或返回任何内存。 为什么?

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
         <asp:GridView ID="gvSelectionList" runat="server" AutoGenerateColumns="false" CssClass="LPSCriteriaSelection" EnableViewState="False">
            <Columns>
                <asp:TemplateField HeaderText="SerialNumber">
                    <ItemTemplate>
                        <asp:HyperLink ID="hlSerialNumber" Text='<%#GetSerialNumberText(Container.DataItem)%>' />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
</asp:Content>

这是代码

using System;
using System.Collections.Generic;
using System.Web.UI;

public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(this.IsPostBack) return;
        ExpandableSelections items = new ExpandableSelections();
        if(items.Count == 0) return;
        this.gvSelectionList.DataSource = items;
        this.gvSelectionList.DataBind();
    }
    protected string GetSerialNumberText(object dataItem)
    {
        SerialNumberData item = (SerialNumberData)dataItem;
        return item.SerialNumber;
    }
}
public class SerialNumberData
{
    public string SerialNumber { get; set; }
    public SerialNumberData(string data) { SerialNumber = data; }
}
public class ExpandableSelections : List<SerialNumberData>
{
    internal ExpandableSelections()
    {   // Emulate database call
        for (int i = 1; i < 72000; i++)
            this.Add(new SerialNumberData("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"));
    }
}

【问题讨论】:

标签: asp.net memory w3wp


【解决方案1】:

对 Microsoft 的调用显示在网格本身上调用 .Dispose() 将使垃圾收集更容易使用它,但在此示例中,GC 线程经常被阻塞(说他们看不到什么——防病毒? ) 并且,因为我们只需要一个只读的 GridView,

我发现用经典的 并在该调用中直接使用 Reponse.Write() 写出 html。

这使用了 更少的 RAM,并且总是会在后续页面加载时返回它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多