2013-01-24 28 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