private void refreshTimer_Tick(object sender, EventArgs e) { #if DEBUG refreshETimer.start(); #endif double timestamp = (DateTime.Now - programLaunchTime).TotalSeconds; itemSelectionPanel.Invoke((MethodInvoker) delegate() { lock (dictionarySyncLock) { int currNumControls = itemSelectionPanel.Controls.Count; if (currNumControls < dataContainerDictionary.Count) { itemSelectionPanel.Controls.Add(new LogItemLabel(itemSelectionPanel.Controls.Count, chartSeriesAdd_Handler, chartSeriesRemove_Handler)); currNumControls = itemSelectionPanel.Controls.Count; } else if (currNumControls > dataContainerDictionary.Count) { itemSelectionPanel.Controls.RemoveAt(itemSelectionPanel.Controls.Count - 1); currNumControls = itemSelectionPanel.Controls.Count; } int seriesIndex = 0; for (int i = 0; i < currNumControls; i++) { var x = dataContainerDictionary.ElementAt(i); itemSelectionPanel.Controls[i].Text = x.Key + ":" + FormatValue(x.Value.LatestValue); if (((LogItemLabel)itemSelectionPanel.Controls[i]).ChartEnabled) { int currIdx = seriesIndex; dataChart.Invoke((MethodInvoker) delegate() { if (dataChart.Series.Count > currIdx) { dataChart.Series[currIdx].Label = x.Key; dataChart.Series[currIdx].Name = x.Key; dataChart.Series[currIdx].ChartType = SeriesChartType.FastLine; dataChart.Series[currIdx].Points.AddXY(timestamp, ParseValue(x.Value.LatestValue)); while (dataChart.Series[currIdx].Points.Count > CONSTRAINED_CHART_SIZE) { dataChart.Series[currIdx].Points.RemoveAt(0); } } }); seriesIndex++; } } dataChart.Invoke((MethodInvoker) delegate() { dataChart.ResetAutoValues(); }); } }); #if DEBUG Console.WriteLine("ElapsedRefreshTime:" + refreshETimer.hasElapsed()); #endif }