private void Flush() { LogMessage[] temp; lock (_syncRoot) { if (_isFlusing) { return; } temp = _pendingMessages.CopyAndClear(); if (temp.Length == 0) { return; } _isFlusing = true; } _logMsgStat.Remove(temp); try { var messages = new List <LogMessage>(); DisposeLogMessage disposeMessage = null; ILogSource prevSource = null; var level = default(LogLevels); foreach (var message in temp) { if (prevSource == null || prevSource != message.Source) { prevSource = message.Source; level = prevSource.GetLogLevel(); } if (level == LogLevels.Inherit) { level = Application.LogLevel; } if (level <= message.Level) { messages.Add(message); } if (message.IsDispose) { disposeMessage = (DisposeLogMessage)message; } else if (LocalTimeZone != null) { message.Time = message.Time.Convert(LocalTimeZone); } } if (messages.Count > 0) { _listeners.Cache.ForEach(l => l.WriteMessages(messages)); } disposeMessage?.Pulse(); } catch (Exception ex) { Debug.WriteLine(ex); } finally { lock (_syncRoot) _isFlusing = false; } }