【问题标题】:Control Cache In asp.net在asp.net中控制缓存
【发布时间】:2009-10-25 23:01:07
【问题描述】:

在一个模块中,我有一个创建 modalpopup 并显示操作结果的子程序。我不想拖放 modalpopup 扩展器并使 html 变得复杂,因此我在代码隐藏中执行此操作。我想知道我可以缓存我的面板和然后从缓存中获取它?创建这些面板需要时间。或者你有建议来提高这个 Sub 的性能吗?我使用 Script Combining、JS minify 和 Css minify。我的 sub 的代码在这里。

Public Sub Raise_Alarm(ByVal p_Page As Page, ByRef p_AssignedButton As System.Web.UI.WebControls.Button, ByVal p_Message As String, Optional ByVal p_Type As MessageType = MessageType.Success)

    Dim placeHolder As PlaceHolder = p_Page.FindControl("plcMsg")

    Dim lblStatus As System.Web.UI.WebControls.Label
    lblStatus = p_Page.FindControl("lblStatus")
    lblStatus.Width = Unit.Percentage(100)
    lblStatus.Font.Name = "verdana"
    lblStatus.Font.Size = System.Web.UI.WebControls.FontUnit.XSmall


    'Create Modalpopup extender
    Dim mdlMessage As New AjaxControlToolkit.ModalPopupExtender

    'Create Divs
    Dim pnlMessage As New System.Web.UI.WebControls.Panel
    Dim pnlFrame As New System.Web.UI.WebControls.Panel
    Dim pnlContainer As New System.Web.UI.WebControls.Panel
    Dim pnlHeader As New System.Web.UI.WebControls.Panel
    Dim pnlMsg As New System.Web.UI.WebControls.Panel
    Dim pnlBody As New System.Web.UI.WebControls.Panel
    Dim pnlFooter As New System.Web.UI.WebControls.Panel
    Dim pnlRight As New System.Web.UI.WebControls.Panel
    '*******

    'Create Ok Buttons

    Dim btnOk As New System.Web.UI.WebControls.Button

    'Create Message Label

    Dim lblMessage As New System.Web.UI.WebControls.Label
    Dim myheader As New System.Web.UI.WebControls.Label
    'Assign Properties 

    pnlMessage.ID = "pnlMessage"
    pnlMessage.CssClass = "modal-dialog"
    pnlMessage.Style.Add("display", "none")

    pnlFrame.ID = "pnlframe"
    pnlFrame.CssClass = "frame"
    pnlContainer.ID = "container"
    pnlContainer.CssClass = "container"
    pnlHeader.ID = "header"
    pnlHeader.CssClass = "header"

    myheader.ID = "headerlabel"
    myheader.Text = "Warning"

    pnlMsg.ID = "msg"
    pnlMsg.CssClass = "msg"

    pnlBody.ID = "body"
    pnlBody.CssClass = "body"

    pnlFooter.ID = "footer"
    pnlFooter.CssClass = "footer"

    pnlRight.ID = "right"
    pnlRight.CssClass = "right"

    btnOk.ID = "btnOk"
    btnOk.Width = Unit.Pixel(50)
    btnOk.Text = "Ok"
    btnOk.CssClass = "but"      
    btnOk.OnClientClick = "Dispose()"



    lblMessage.ID = "lblMessage"
    lblMessage.Text = p_Message
    lblMessage.CssClass = "body"

    If p_Type = MessageType.Success Then

        lblStatus.ForeColor = System.Drawing.Color.Blue
        lblStatus.Text = p_Message
        lblStatus.Visible = True

    ElseIf p_Type = MessageType.Error Then

        lblStatus.ForeColor = System.Drawing.Color.Red

    End If


    pnlRight.Controls.Add(btnOk)
    pnlFooter.Controls.Add(pnlRight)
    pnlBody.Controls.Add(lblMessage)
    pnlBody.Controls.Add(pnlFooter)
    pnlMsg.Controls.Add(myheader)
    pnlHeader.Controls.Add(pnlMsg)
    pnlContainer.Controls.Add(pnlHeader)
    pnlContainer.Controls.Add(pnlBody)
    pnlFrame.Controls.Add(pnlContainer)
    pnlMessage.Controls.Add(pnlFrame)


    With mdlMessage


        .TargetControlID = p_AssigedButton.ID
        .PopupControlID = pnlMessage.ID
        .ID = "mdlMessage"
        .BackgroundCssClass = "modalBackground"
        .OkControlID = btnOk.ID
        .Page = p_Page

    End With

    placeHolder.Controls.Add(pnlMessage)
    placeHolder.Controls.Add(mdlMessage)
    mdlMessage.Show()
End Sub  

【问题讨论】:

  • 你试过 HttpContext.Current.Cache 吗?
  • 不,我没试过。我可以用它来控制吗?
  • 看看右边的相关问题,例如:stackoverflow.com/questions/44757/…
  • 好的,我在问这个问题之前看过它。顺便说一下 HttpContext.Current.Cache 对我有用。谢谢。

标签: asp.net caching


【解决方案1】:

你测量过这个潜艇的性能吗?

我们看过一次,发现即使创建 1000 个对象也只有几纳秒。

如果你想缓存一些东西,它必须是可序列化的。为了给您带来改进,反序列化所需的时间必须少于创建新对象所需的时间。

您似乎没有从数据库中获取任何值,因此我认为您不能通过缓存来优化此代码。

编辑

不做缓存还有其他几个原因:

  • 这会使您的程序复杂化,您需要先检查某个值是否在缓存中,然后才能使用它。
  • 存在引入错误的可能性。以 lblStatus 为例,它会根据参数更改值。如果您只是从缓存中读取它,您可能会得到一个与您的参数不匹配的数据。

【讨论】:

  • 嗨 Shiraz,我已经测量了性能,当然创建这些对象甚至不需要 1 秒。但是想象一下 1000 个用户打开页面并创建这些对象,它不会降低性能吗?我尝试了 Alison 的缓存推荐,但仍然认为从缓存中获取 div 是否会给我带来性能优势?你知道 asp.net ajax 的控件有时会严重影响应用程序,我不想遇到性能问题,因此我想尝试缓存解决方案
  • 你应该只考虑性能,当它成为一个问题时。与实际计划数量相比,对您的应用程序进行压力测试,看看会发生什么。在大多数情况下,只使用 ASP.Net 中的每页缓存机制就足够了。
【解决方案2】:

将控件插入缓存:

//Make sure to adjust the expiration of the cache with a contstant
Cache.Insert("pnlPanelMessage", pnlMessage, null, DateTime.MaxValue, TimeSpan.FromMinutes(15));

从缓存中检索控件:

System.Web.UI.WebControls.Panel pnlMessage = (System.Web.UI.WebControls.Panel)Cache.Get("pnlPanelMessage")

MSDN:ASP.NET Caching: Techniques and Best Practices

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2017-06-22
    • 2011-02-20
    • 2010-10-08
    • 2013-05-22
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多