private void WriteThreadProc() { Logger.Trace("WriteThreadProc() begin"); bool needToFlush = false; while (_runWriteThread) { try { while (_metricValueQueue.Count > 0) { MetricValue metricValue = null; lock (_queueLock) { if (_metricValueQueue.Count > 0) { metricValue = _metricValueQueue.Dequeue(); } } if (metricValue != null) { needToFlush = true; metricValue.Interval = _interval; _aggregator.Aggregate(ref metricValue); metricValue.AddMetaData(_metaData); foreach (IMetricsPlugin plugin in _plugins) { var writePlugin = plugin as IMetricsWritePlugin; if (writePlugin == null) { // skip if plugin is not a writeplugin, it might be a readplugin continue; } writePlugin.Write(metricValue); } } } if (needToFlush) { needToFlush = false; foreach (IMetricsPlugin plugin in _plugins) { var writePlugin = plugin as IMetricsWritePlugin; if (writePlugin != null) { // flush only if it is a Write plugin writePlugin.Flush(); } } } if (_metricValueQueue.Count <= 0) { Thread.Sleep(1000); } } catch (Exception exp) { Logger.Error("WriteThreadProc() got exception : ", exp); } } Logger.Trace("WriteThreadProc() return"); }