Au cours de la période passée, la plupart de mes classes de base utilisaient une combinaison de lock et de Hashtable pour implémenter la gestion des conflits pour les caches multi-threads. Cependant, parfois la combinaison de ces deux n'était pas satisfaisante, la collection avait été ajoutée. Exception, le problème est resté le même après plusieurs traitements du code. Enfin, la collection de dictionnaires synchronisés multithread ConcurrentDictionary introduite après .NET 4.0 a été utilisée et le problème a été résolu avec succès.
Dans ma classe de base, créez l'objet métier. Généralement, vous pouvez utiliser BLLFactory
var result = BLLFactory<Customer>.Instance.FindFirst(); Console.WriteLine(result.ToJson());
Ainsi, après avoir utilisé BLLFactory
HashTable représente une collection de paires clé/valeur. Dans le .NET Framework, Hashtable est un conteneur fourni par l'espace de noms System.Collections. Il est utilisé pour traiter et représenter des paires clé-valeur. La clé peut généralement être utilisée pour une recherche rapide et la clé est sensible à la casse ; est utilisé pour stocker la valeur correspondant à la clé. Les paires clé-valeur dans Hashtable sont toutes de type objet, donc Hashtable peut prendre en charge tout type de paire clé-valeur, et tout objet non nul peut être utilisé comme clé ou valeur.
En utilisant cette méthode, des conflits d'accès multi-thread se produisent encore du côté Web. Pour cette raison, nous pouvons également utiliser du code de test multi-thread pour tester et reproduire l'erreur,
try{ List<Thread> list = new List<Thread>();for (int i = 0; i < 10; i++) { Thread thread = new Thread(() =>{var result = BLLFactory<Customer>.Instance.FindFirst(); Console.WriteLine(result.ToJson()); Console.WriteLine(); }); list.Add(thread); }for (int i = 0; i < list.Count; i++) { list[i].Start(); } }catch(Exception ex) { LogTextHelper.Error(ex); }
TKey, TValue> est accessible par plusieurs threads en même temps et est thread-safe. Son utilisation est la même que celle du dictionnaire, mais avec quelques méthodes supplémentaires. ConcurrentDictionary appartient à l’espace de noms System.Collections.Concurrent. L'espace de noms System.Collections.Concurrent fournit plusieurs classes de collection thread-safe. Lorsque plusieurs threads accèdent simultanément à des collections, ces classes doivent être utilisées à la place des types correspondants dans les espaces de noms System.Collections et System.Collections.Generic . public bool TryAdd(TKey key, TValue value)public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue)public TValue this[TKey key] { get; set; }public TValue AddOrUpdate(TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory)
public TValue AddOrUpdate(TKey key, TValue addValue, Func<TKey, TValue, TValue> updateValueFactory)public TValue GetOrAdd(TKey key, TValue value)public TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)
/// <summary>/// 对业务类进行构造的工厂类/// </summary>/// <typeparam name="T">业务对象类型</typeparam>public class BLLFactory<T> where T : class{//采用ConcurrentDictionary线程安全的集合类来缓存,替代Hashtableprivate static ConcurrentDictionary<string, object> conCurrentCache = new ConcurrentDictionary<string, object>(); /// <summary>/// 创建或者从缓存中获取对应业务类的实例/// </summary>public static T Instance
{get{string CacheKey = typeof(T).FullName;return (T)conCurrentCache.GetOrAdd(CacheKey, s =>{var bll = Reflect<T>.Create(typeof(T).FullName, typeof(T).Assembly.GetName().Name); //反射创建,并缓存return bll;
});
}
}
}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!