Comment traiter avec les coûteuses opérations de renforcement à l'aide de MemoryCache?

Sur un ASP.NET projet MVC nous avons plusieurs cas de données qui nécessite une bonne quantité de temps et de ressources pour construire. Nous voulons les mettre en cache.

MemoryCache fournit un certain niveau de fil de sécurité, mais pas assez pour éviter l'exécution de plusieurs instances de code du bâtiment en parallèle. Voici un exemple:

var data = cache["key"];
if(data == null)
{
  data = buildDataUsingGoodAmountOfResources();
  cache["key"] = data;
}

Comme vous pouvez le voir sur un site occupé de centaines de threads peuvent aller à l'intérieur de la si la déclaration simultanément jusqu'à ce que les données sont construites et de faire de l'exploitation d'un bâtiment encore plus lente, consommer inutilement les ressources du serveur.

Il y a un atomique AddOrGetExisting mise en œuvre dans MemoryCache mais il requiert incorrectement "valeur pour définir" au lieu de "code pour récupérer la valeur à définir" qui, je pense, rend la méthode donnée presque totalement inutile.

Nous avons été à l'aide de notre propre ad-hoc de l'échafaudage autour de MemoryCache pour y arriver mais il faut explicite locks. C'est gênant à l'utilisation par l'entrée de verrouillage des objets et nous avons l'habitude de sortir par le partage d'objets de verrou qui est loin d'être idéale. Qui m'a fait penser que les raisons d'éviter une telle convention pourrait être intentionnelle.

J'ai donc deux questions:

  • Est-il préférable de ne pas lock code du bâtiment? (Qui peut avoir été prouvé plus réactifs pour l'un, je me demande)

  • Quel est le bon chemin pour atteindre par l'entrée de verrouillage pour MemoryCache pour une telle serrure? La forte envie d'utiliser key chaîne que le verrou de l'objet est rejeté à l' ".NET de blocage 101".