public static void Send(string name, string message, string nameSpace /*, ILogger logger*/, Exception exception = null, long frequency = 0) { // --- thread safe var sendMailKey = CollectorKey.Create(name, nameSpace /*, logger*/, frequency); var key = sendMailKey.Key(); //---------------- // --- thread safe //bool lockTaken = false; cacheLock.EnterUpgradeableReadLock(); try { //Monitor.Enter(locker, ref lockTaken); if (!keys.ContainsKey(key)) { cacheLock.EnterWriteLock(); try { keys[key] = sendMailKey; //logger.Log("Число ключей в кеше: '{0}'", keys.Count); Debug.WriteLine("[{0}] {1} Число ключей в кеше: '{2}'", Thread.CurrentThread.ManagedThreadId, key, keys.Count); } finally { cacheLock.ExitWriteLock(); } } else { cacheLock.EnterReadLock(); try { sendMailKey = keys[key]; } finally { cacheLock.ExitReadLock(); } sendMailKey.SetFrequency(frequency); } } catch (Exception ex) { //logger.LogException("Сборщик уведомлений. Ошибка.", ex); Debug.WriteLine("[{0}] Сборщик уведомлений. Ошибка. {1}", Thread.CurrentThread.ManagedThreadId, ex.Message); } finally { //if (lockTaken) Monitor.Exit(locker); cacheLock.ExitUpgradeableReadLock(); } //---------------- sendMailKey.Add(message, exception); sendMailKey.CheckThread(); }
internal static CollectorKey Create(string name, string nameSpace /*, ILogger logger*/, long frequency = 0) { // --- thread safe var sendMailKey = new CollectorKey(); sendMailKey.name = name; sendMailKey.nameSpace = nameSpace; //sendMailKey.logger = logger; sendMailKey.frequency = frequency <= 0 ? TimeSpan.FromMinutes(30).Ticks : frequency; return(sendMailKey); // -------------- }