2009-08-21 2 views
0

zurück Ich arbeite an einer asp.net MVC-Anwendung.MethodInfo.Invoke gibt manchmal null zurück und gibt manchmal den Wert

Ich habe eine Klasse, die ein Repository umbricht, das Daten aus einer db mit einfachen Linq-Anweisung abruft. Ich habe eine Decorator-Klasse geschrieben, um Caching-Logik hinzuzufügen (mit Caching-Anwendungsblock).

Da ich mehrere Methoden habe, die ich dekorieren will, und die Logik ist für alle gleich (prüfen, ob im Cache vorhanden ist, wenn nicht Real Getter aufrufen und im Cache speichern), schrieb ich etwas wie dieses:

eine Hilfsmethode, die die gemeinsame Logik der Überprüfung tut, wenn im Cache vorhanden ist und so weiter:

public object CachedMethodCall(MethodInfo realMethod, params object[] realMethodParams) 
    { 
     object result = null; 
     string cacheKey = CachingHelper.GenereateCacheKey(realMethod, realMethodParams); 

     // check if cache contains key, if yes take data from cache, else invoke real service and cache it for future use. 
     if (_CacheManager.Contains(cacheKey)) 
     { 
      result = _CacheManager.GetData(cacheKey); 
     } 
     else 
     { 
      result = realMethod.Invoke(_RealService, realMethodParams); 

      // TODO: currently cache expiration is set to 5 minutes. should be set according to the real data expiration setting. 
      AbsoluteTime expirationTime = new AbsoluteTime(DateTime.Now.AddMinutes(5)); 
      _CacheManager.Add(cacheKey, result, CacheItemPriority.Normal, null, expirationTime); 
     } 

     return result; 
    } 

das alles in Ordnung und schön funktioniert. in jedem eingerichteten Verfahren habe ich den folgenden Code:

StackTrace currentStack = new StackTrace(); 
string currentMethodName = currentStack.GetFrame(0).GetMethod().Name; 
var result = (GeoArea)CachedMethodCall(_RealService.GetType().GetMethod(currentMethodName), someInputParam); 
return result; 

das Problem ist, dass manchmal die Linie, wo realMethod.Invoke (...) geschieht null zurück. Wenn ich direkt danach einen Haltepunkt setze und dann die Ausführung an diese Zeile zurücksende, ist das Ergebnis nicht null und Daten werden von der DB geholt. alle Eingabevariablen sind korrekt, Daten existieren in der DB, 2. Lauf bekommt die Daten, also was läuft beim ersten Lauf schief ?!

Dank :)

Antwort

0

Ich glaube, ich durch die Aktualisierung des Code, um dieses Problem zu lösen, wie folgt verwaltet: wenn der Cache

public object CachedMethodCall(MethodInfo realMethod, params object[] realMethodParams) 
    { 
     string cacheKey = CachingHelper.GenereateCacheKey(realMethod, realMethodParams); 

     object result = _CacheManager.GetData(cacheKey); 

     if (result == null) 
     { 
      result = realMethod.Invoke(_RealService, BindingFlags.InvokeMethod, null, realMethodParams, CultureInfo.InvariantCulture); 

      // TODO: currently cache expiration is set to 5 minutes. should be set according to the real data expiration setting. 
      AbsoluteTime expirationTime = new AbsoluteTime(DateTime.Now.AddMinutes(5)); 
      _CacheManager.Add(cacheKey, result, CacheItemPriority.Normal, null, expirationTime); 
     } 

     return result; 
    } 

ich, dass der vorherige _CacheManager.Contains Anruf bemerkte manchmal wahr sogar zurückkehrt enthielt die Daten nicht. Ich vermute Threads, die die Probleme verursachen, aber ich bin mir nicht sicher ...