/// <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); }
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); }