Exemple #1
0
        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);
            // --------------
        }