[C#] Daten nicht doppelt laden
spacer
Autor Nachricht
jg72
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 10.05.11 09:27 
Verwendete Sprache: C#
Hallo Zusammen,

ich habe eine Klasse, welche Daten aus einer Datenbank lädt. Sehr vereinfacht etwa so:

ausblenden Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
class Item
{
int m_nId;
string m_sText;

//...

static Item Load(int nId)
{
Item item = new Item();
// Werte laden
return item;
}
}


Nun sollen die einzelnen Items nur einmal im Speicher vorgehalten werden und nicht immer geladen werden:

ausblenden Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//...
static Item Load(int nId)
{
Item item = HoleSchonGeladenenItem(nId);

if ( item == null )
{
Item item = new Item();
// Werte laden
}
return item;
}
//...


Ich habe nun noch keinen Ansatz, wie ich diese Funktion HoleSchonGeladenenItem schreiben soll (oder welchen anderen Mechanismus ich verwenden kann). Man könnte ja nun alle Einträge in einer SortedList (oder etwas vergleichbares) speichern, allerdings will ich nicht, dass die Einträge länger als nötig im Hautspeicher vorgehalten werden, man müsste also im schlimmsten Fall sowas wie eine Garbage-Collection durchführen. Nur wie stelle ich fest, ob das Objekt noch an anderer Stelle als in der Liste aktiv ist?

Es gibt da bestimmt schon etwas passendes, aber nur was?

Vielen Dank schonmal und viele Grüße,
Jürgen
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 1798
Erhaltene Danke: 250

Win 2000, Win XP, Win7
C++, C# (VS 2005/08/10)
BeitragVerfasst: Di 10.05.11 11:41 
Hallo und willkommen,

speichere am besten die Werte (Items) anhand der Id in einem Dictionary<Key, Value>:
ausblenden C#-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
static Dictionary<int, Item> items = new Dictionary(int, Item>(); // als Klassenmember

static Item Load(int nId)
{
if(items.ContainsKey(nId))
{
return items[nId];
}
else
{
Item item = new Item();
// Werte laden

items.Add(nId, item); // zum Dictionary hinzufügen
return item;
}
}
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Moderator
Beiträge: 3722
Erhaltene Danke: 133

Arch Linux, Win 7
F#, C# (VS2010)
BeitragVerfasst: Di 10.05.11 11:48 
:welcome: in der EE!

Du willst also Objekte cachen, aber nur, solange sie von außerhalb noch referenziert werden? Das erledigt eine WeakHashtable (gibt es auch eingebaut, aber schlecht dokumentiert: msdn.microsoft.com/e...brary/dd287757.aspx).

@Th69: Das würde ja seiner SortedList ohne GC entsprechen.

_________________
>λ=
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 1798
Erhaltene Danke: 250

Win 2000, Win XP, Win7
C++, C# (VS 2005/08/10)
BeitragVerfasst: Di 10.05.11 12:10 
Sorry, hatte den entscheidenden Satz wohl überlesen. :oops:

Als weitere Alternative könnte man eine WeakReference benutzen: msdn.microsoft.com/d...m.weakreference.aspx (s. besonders das Beispiel mit dem Dictionary)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jg72 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 10.05.11 17:35 
Vielen Dank erstmal,

ich habe jetzt wohl ein bißchen was zum Lesen. Mal sehen, was ich davon verstehe

Viele Grüße,
Jürgen
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home