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