1

我在 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"]但是,除非我更改值,否则大多数情况下结果都是相同的。我在想是否有更好的方法可以将结果存储在某个地方并使用它。

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

4

6 回答 6

1

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

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

可以将Cache项目设置为在一定时间后过期,因此如果基础数据发生更改,您可以确定该值将每隔一段时间更新一次。

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

于 2013-01-24T09:45:39.553 回答
1

就像是?

private string collectOrders = String.Empty;

public OrderCollection GetAllClickCollectOrders
{
    get
    {
        if(String.IsNullOrEmpty(collectOrders)
             collectOrders = GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
        return collectOrders;
    }
}
于 2013-01-24T09:46:23.980 回答
1

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

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

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

于 2013-01-24T09:47:20.990 回答
1

你不能有类似的东西:

private OrderCollection AllClickCollectOrders;

public OrderCollection GetAllClickCollectOrders
{
    get
    {
        if(AllClickCollectOrders == null)
        {
           AllClickCollectOrders = GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
        }
        return AllClickCollectOrders;
    }
}
于 2013-01-24T09:47:35.973 回答
1

简单的回答:

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

         return _GetAllClickCollectOrders;

    }
}
于 2013-01-24T09:49:04.443 回答
1

System.Lazy<T>应该是你要找的。

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

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

于 2013-01-24T09:45:18.710 回答