2013-01-24 29 views
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; 
} 

因此,可以说WHN我要收集我我这样叫它。

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

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

所以每当我使用属性,它每次调用方法和进入数据库,并返回我结果。但是,除非我更改Session["SelectedStorePostCode"]值,否则大部分时间结果都是相同的。我在想,是否有更好的方法来存储某个地方的结果并使用它。

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

+0

Ÿ不首先检查是否存在会话的变化[ “SelectedStorePostCode”]值或not..then通话功能.. –

+0

你有什么尝试?你有没有想过一个简单的缓存?为什么它不适合你? – GameScripting

+0

我根本没有想过缓存。但我认为这会使页面更加沉重,因为我不确定返回集合有多少记录。它可能是1,100,1000 .. –

回答

1

System.Lazy<T>应该是你在找什么。

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

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

+0

它会更有用,如果你可以举一些使用这个与我的问题相关的例子... –

+1

我已经扩展了我的答案。我希望现在更有帮助。 –

2

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

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

A Cache item可以设置为在一段时间后过期,因此如果底层数据发生了变化,您可以确定该值会经常更新。

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

1

有点像?

private string collectOrders = String.Empty; 

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

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

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

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

+0

我认为你是对的...如果价值没有改变,那么你的代码可能会起作用,但如果价值改变,然后我需要比较会话...... –

+1

作为一个简单的解决方法,你可以清除相关的会话改变OrderCollection时变量。 – daryal

1

你能不能有这样的:

private OrderCollection AllClickCollectOrders; 

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

这在我看来是一种合理的方式,在调用方法之前检查它.. –

1

答案很简单:

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

     return _GetAllClickCollectOrders; 

    } 
} 
+0

这可能是有用的。 –

+0

如果它解决了您的问题,请将其标记为答案。 – mihirj