J'ai le code suivant avec lequel je veux réaliser ce qui suit.Verrouiller un objet dans une opération asynchrone
- Vérifiez si une valeur est dans le cache
- Si dans le cache, obtenir la valeur de celle-ci et procéder
- Sinon dans le cache, effectuez la logique pour entrer dans le cache, mais faire async que l'opération pour faire cela peut prendre une longue période de temps et je ne veux pas tenir l'utilisateur
Comme vous le verrez dans mon code, je place un verrou sur le cache dans le fil asynchrone. Ma configuration est-elle en dessous du thread sécurisé? Et en plaçant le verrou, cela signifie que le cache ne sera pas accessible aux autres threads à lire à partir du cache tant que l'opération asynchrone aura lieu. Je ne veux pas d'une circonstance où le cache est verrouillé dans un thread asynchrone empêchant d'autres demandes d'y accéder.
Il est également possible que la même requête soit appelée par plusieurs threads, d'où le verrou.
Toutes les recommandations pour améliorer le code seraient excellentes.
// Check if the value is in cache
if (!this.Cache.Contains(key))
{
// Perform processing of files async in another thread so rendering is not slowed down
ThreadPool.QueueUserWorkItem(delegate
{
lock (this.Cache)
{
if (!this.Cache.Contains(key))
{
// Perform the operation to get value for cache here
var cacheValue = operation();
this.Cache.Add(key, cacheValue);
}
}
});
return "local value";
}
else
{
// Return the string from cache as they are present there
return this.Cache.GetFilename(key);
}
Remarque: this.Cache représente un objet de cache.
L'application est une application web sur .net 3.5.
Oui, je pense que c'est une meilleure option pour déplacer la position du verrou juste à l'ajout au cache. Cela gérera également la situation où la même clé peut être ajoutée deux fois si le thread asynchrone est déclenché plus d'une fois. Que voulez-vous dire quand vous dites ConcurrentDictionary? – amateur
Vous souhaitez empêcher plusieurs appels à l'opération() bien que dans le cas où il y a des échecs de cache sur la même valeur. Par exemple, si 3 threads ont besoin de la même valeur, cette solution appellera operation() 3 fois, alors que la solution d'origine n'appellera qu'une seule fois. –
@Nail: 'ConcurrentDictionary' est un type de collection introduit avec .NET 4.0. C'est dans l'espace de noms 'System.Collections.Concurrent'. –