代码优化:通过存储返回值来减少方法调用

时间:2013-01-24 09:41:03

标签: c# asp.net optimization

我在c#中创建了一个相当简单的方法,但我在页面的任何地方都使用它。有没有办法减少方法调用,我的意思是一旦调用方法,返回值存储在某处,我使用该值代替。这是我的代码。

我已经宣布了一些像这样的公共财产。

public OrderCollection GetAllClickCollectOrders
{
    get
    {
        return GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
    }
}

public OrderCollection GetShippedClickCollectOrders
{
    get
    {
        return GetShippedClickCollectOrderDetails();
    }
}

以下是方法..

protected OrderCollection GetClickCollectOrderDetails(string postcode)
{
    // some database ziggy wiggy...

    return cncOrderCol;
}

protected OrderCollection GetShippedClickCollectOrderDetails()
{
    // some database ziggy wiggy...

    return cncShippedOrderCol;
}

所以,让我们说我想要的收藏方式是我这样称呼的。

BindGridView(GetAllClickCollectOrders);
orderCount.Text = "Total orders placed: " + GetAllClickCollectOrders.Count;

if (isShipped.Checked)
{
    BindGridView(GetShippedClickCollectOrders);
    orderCount.Text = "Total orders shipped: " + GetShippedClickCollectOrders.Count;
}

因此,每当我使用该属性时,它每次调用方法并转到数据库并返回结果。但是,除非我更改Session["SelectedStorePostCode"]值,否则大多数时间结果都是相同的。我在想是否有更好的方法可以将结果存储在某处并使用它。

注意:代码工作正常但我正在寻找更好的性能。谢谢你们......

6 个答案:

答案 0 :(得分:2)

您似乎想要的是缓存数据库调用的结果。

您可以通过将数据库中的结果存储在Cache类的实例中来实现。

Cache项可以设置为在一定时间后过期,因此如果基础数据发生变化,您可以确定该值会经常更新。

这适用于在所有用户(会话)之间共享的项目 - 如果您希望缓存用户之间唯一的项目,则可以将值存储在会话变量中,但这可能会导致Web服务器上的内存压力。

答案 1 :(得分:1)

System.Lazy<T>应该是您正在寻找的。

public OrderCollection GetAllClickCollectOrders {
  get {
    return m_allClickCollectOrders.Value;
  }
}
private Lazy<OrderCollection> m_allClickCollectOrders = new Lazy<OrderCollection>(
  () => GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString())); 

当然,这假设值在初始化后永远不会改变。如果它可以改变,其他答案可能更适合。

答案 2 :(得分:1)

之类的东西?

private string collectOrders = String.Empty;

public OrderCollection GetAllClickCollectOrders
{
    get
    {
        if(String.IsNullOrEmpty(collectOrders)
             collectOrders = GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
        return collectOrders;
    }
}

答案 3 :(得分:1)

您可以将值存储为Session变量;

public OrderCollection GetAllClickCollectOrders
{
    get
    {
        if(Session["OrderCollection"] == null)
        {
            Session["OrderCollection"] = GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
         return Session["OrderCollection"] as OrderCollection;
    }
}

此方法的一个缺点是您无法知道数据库中是否有任何更改。如果价值不变,没问题;否则,您需要实现适当的缓存机制,以在db更改时删除相关的会话变量。

答案 4 :(得分:1)

你能不能拥有:

private OrderCollection AllClickCollectOrders;

public OrderCollection GetAllClickCollectOrders
{
    get
    {
        if(AllClickCollectOrders == null)
        {
           AllClickCollectOrders = GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
        }
        return AllClickCollectOrders;
    }
}

答案 5 :(得分:1)

简单回答:

OrderCollection _GetAllClickCollectOrders = null;
bool goToDB = false;
public OrderCollection GetAllClickCollectOrders
{
    get
    {
         if(_GetAllClickCollectOrders == null || goToDB)
        _GetAllClickCollectOrders = GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());

         return _GetAllClickCollectOrders;

    }
}