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

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 に答える
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;
    }
}

このアプローチの欠点の 1 つは、データベースに変更があるかどうかを知ることができないことです。値が変わらなければ問題ありません。それ以外の場合は、適切なキャッシュ メカニズムを実装して、データベースが変更されたときに関連するセッション変数を削除する必要があります。

于 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 に答える