2017-12-14 3 views
0

Ich versuche, eine Instanz der MemoryCache-Klasse zu erstellen, um einige Dokument Informationen zwischenzuspeichern. Problem ist, dass, obwohl ich keine Ausnahmen bekomme, die MemoryCache-Instanz immer 'Nothing' zurückgibt. Ich verwende die folgenden Code-Teile;vb.net-Instanz von MemoryCache gibt immer nichts aus dem Cache

Bau der Instanz:

Private Shared ObjInfoCache As MemoryCache 
Public Sub New() 
    Dim CacheSettings As NameValueCollection = New NameValueCollection(3) 
    CacheSettings.Add("CacheMemoryLimitMegabytes", 1024.ToString()) 
    CacheSettings.Add("physicalMemoryLimitPercentage", 50.ToString()) 
    CacheSettings.Add("pollingInterval", TimeSpan.FromMinutes(2).ToString()) 
    ObjInfoCache = New MemoryCache("TestCache", CacheSettings) 
End Sub 

Code, speichert/ruft die Informationen (die immer in die if-Anweisung springt):

arrayOfPropValues = ObjInfoCache(docID) 
If arrayOfPropValues Is Nothing Then 
    arrayOfPropValues = GetDocumentInfo(docID, arrayOfPropNames) 
    ObjInfoCache.Add(docID, arrayOfPropValues, New CacheItemPolicy() With {.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(60)}) 
End If 

Durch Tests ich gefunden habe, mit, dass die Standard-Memory Beispiel ObjInfoCache = MemoryCache.Default funktioniert perfekt. Es lässt mich jedoch nicht die Limit-Eigenschaften festlegen, die ich brauche. Ich habe auch versucht, eine neue MemoryCache-Instanz zu erstellen, ohne die Einstellungen ObjInfoCache = new MemoryCache("TestCache") hinzuzufügen, die immer noch Nothing zurückgibt.

Ich bin mit .NET Framework 4

+0

Ein Konstruktor kann einfach 'Nothing' nicht zurückgeben. Ein Konstruktor erstellt ein Objekt und die einzige Möglichkeit, ein Objekt nicht zu erstellen, ist eine Ausnahme auszulösen. Etwas anderes passiert. – jmcilhinney

+1

Übrigens, ist Ihnen bewusst, dass Sie diese Grenzen in der Konfigurationsdatei angeben können und die 'Default'-Instanz sie von dort verwenden? – jmcilhinney

+0

@jmcilhinney, yep, ich habe gerade die Konfigurationseinstellungen gefunden :) thx obwohl. Immer noch neugierig, warum es nicht funktioniert. Habe gerade ein neues leeres Projekt in C# erstellt und es funktioniert dort einwandfrei. Über die Rückkehr; Ich meinte, dass es Nothing zurückgab, wenn eine Variable von der Cacheinstanz aufgerufen wurde (der Konstruktor war nur da, um zu zeigen, wie ich die Instanz initialisiere). Tut mir leid, wenn ich ein bisschen vage war. [Konfigurationsdatei als Referenz für Personen, die hierher kommen] (https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/memorycache-element-cache-settings) – STDMP

Antwort

1

über die Rückkehr; Ich meinte es nichts zurückgegeben, wenn eine Variable aus dem Cache-Instanz aufrufen

Ich vermute, dass Sie mehrere Instanz der Klasse erstellen, die ObjInfoCache.

Sie definiert ObjInfoCache als Shared, erklärt haben, damit ihre Referenz ist gemeinsam, alle Instanzen der Klasse. Sie initialisieren diese Referenz jedoch im Klasseninstanzkonstruktor (Public Sub New()). Ändern Sie den Konstruktor in Shared, sodass es nur einmal ausgeführt wird, wenn auf den Typ verwiesen wird.

Shared Sub New() 
    Dim CacheSettings As NameValueCollection = New NameValueCollection(3) 
    CacheSettings.Add("CacheMemoryLimitMegabytes", 1024.ToString()) 
    CacheSettings.Add("physicalMemoryLimitPercentage", 50.ToString()) 
    CacheSettings.Add("pollingInterval", TimeSpan.FromMinutes(2).ToString()) 
    ObjInfoCache = New MemoryCache("TestCache", CacheSettings) 
End Sub 
+0

Ja das ist es! Vielen Dank. Ich kann nicht glauben, dass ich das selbst nicht bemerkt habe. Schätze das, weil 'MemoryCache.Default' funktioniert hat, warf es mich auf die falsche Spur, obwohl es jetzt absolut Sinn macht. – STDMP