Example #1
0
        /// <summary>
        /// 记录指定的日志信息
        /// 说明:此方法是一个异步版本,内部维护一个缓冲队列,每5秒钟执行一次写入动作
        /// </summary>
        /// <typeparam name="T">日志信息的类型参数</typeparam>
        /// <param name="info">要写入的日志信息</param>
        public static void Write <T>(T info) where T : BaseInfo
        {
            // 触发日志的配置检查
            WriterFactory.Init();

            // 忽略特定的对象类型
            if (s_filter.Instance.IgnoreWrite(info))
            {
                return;
            }

            // 所有需要记录到日志的数据类型必须配置,否则不记录(因为不知道以什么方式记录)!
            if (WriterFactory.IsSupport(typeof(T)) == false)
            {
                throw new NotSupportedException("不支持未配置的数据类型。");
            }


            // 为第一次调用,创建定时器
            if (s_timer == null)
            {
                lock ( s_lock ) {
                    if (s_timer == null)
                    {
                        StartTimer();
                    }
                }
            }

            // 获取指定消息类型的写入队列,并将日志信息放入队列
            ICacheQueue queue = GetCacheQueue <T>();

            queue.Add(info);
        }
Example #2
0
        private static ICacheQueue GetCacheQueue <T>() where T : BaseInfo
        {
            Type t = typeof(T);

            // 这里使用了 Hashtable 的并发特有机制:允许 多个读,一个写

            ICacheQueue queue = s_queueDict[t] as ICacheQueue;

            if (queue == null)
            {
                lock ((s_queueDict as ICollection).SyncRoot) {
                    queue = s_queueDict[t] as ICacheQueue;

                    if (queue == null)
                    {
                        queue          = new CacheQueue <T>();
                        s_queueDict[t] = queue;
                    }
                }
            }

            return(queue);
        }