Measurement Studio for .NET Languages

cancel
Showing results for 
Search instead for 
Did you mean: 

System.ArgumentException: Item has already been added. Key in dictionary:

Hello,

 

I have been getting this error for several years now, and I need to address it as it may be causing other problems in my application.  I have several XY charts in my application and I am plotting to each of them at 1 Hz.  Most of the time all is well.  Sometimes, possible when I have performance issues with the PC, I get a bunch of errors on the PlotYAppendMultiple call.  The following is the exception trace:

 

07:55:05 DisplayData - Chart Error on Chart 6 waveform .
System.ArgumentException: Item has already been added. Key in dictionary: '191' Key being added: '191'
at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
at System.Collections.Hashtable.Add(Object key, Object value)
at NationalInstruments.UI.Internal.ScaleElement.AddValueToHashtable(Double tickValue, Double deviceTickValue, DivisionBase division, Graphics graphics, Boolean isEndLabel)
at NationalInstruments.UI.Internal.LinearTickGridInfoPopulator.a(Graphics A_0, ScaleElement A_1, Double A_2, Double A_3, Double A_4, Divisions A_5)
at NationalInstruments.UI.Internal.LinearTickGridInfoPopulator.CalculateMajorTicks(Graphics graphics, ScaleElement scaleElement, Double majorTickValue, Double majorDivisionInterval, Double tolerance, Divisions majorDivisions)
at NationalInstruments.UI.Internal.LinearTickGridInfoPopulator.NonLogDivisionMajorVisibleMinorNotVisibleMajorGridNotVisibleMinorGridNotVisible(Graphics graphics, ScaleElement scaleElement, Int32 numberOfMajorTicks, Double majorTickValue, Double minorTickValue, Double majorDivisionInterval, Double minorDivisionInterval, Double tolerance, Divisions majorDivisions, Divisions minorDivisions)
at NationalInstruments.UI.Internal.ScaleElement.CalculateLinearDivisionData(Graphics graphics, Double majorDivisionInterval, Double minorDivisionInterval)
at NationalInstruments.UI.Internal.AxisElement.CalculateDivisionData(LayoutArgs layoutArgs, Boolean isLayingOut)
at NationalInstruments.UI.Internal.XInnerAxisElement.Layout(LayoutArgs layoutArgs)
at NationalInstruments.Restricted.XYGraphManager.OnXAxisDivisionsChanged(Object sender, ControlElementEventArgs e)
at NationalInstruments.Restricted.ControlElementEventHandler.Invoke(Object sender, ControlElementEventArgs e)
at NationalInstruments.UI.Internal.ScaleElement.OnDivisionsChanged(Object sender, ControlElementEventArgs e)
at NationalInstruments.UI.Internal.ScaleElement.OnDivisionsChanged()
at NationalInstruments.UI.Internal.ScaleElement.set_Range(Range value)
at NationalInstruments.Restricted.XYGraphManager.ScaleAxes(CartesianPlotElement sourcePlot)
at NationalInstruments.Restricted.XYGraphManager.ScaleAxesOnPlotDataChanged(Object sender, ControlElementEventArgs e)
at NationalInstruments.Restricted.ControlElementEventHandler.Invoke(Object sender, ControlElementEventArgs e)
at NationalInstruments.UI.Internal.PlotElement.OnDataChanged(ControlElementEventArgs e)
at NationalInstruments.UI.Internal.CartesianPlotElement.a(Object A_0, PlotDataChangedEventArgs A_1)
at NationalInstruments.UI.Internal.PlotDataChangedEventHandler.Invoke(Object sender, PlotDataChangedEventArgs e)
at NationalInstruments.UI.Internal.XYDataManager.a(PlotDataChangedEventArgs A_0)
at NationalInstruments.UI.Internal.XYDataManager.CopyYData[TStart,TIncrement](Double[] yData, Int32 startIndex, Int32 length, TStart start, TIncrement increment, Boolean append)
at NationalInstruments.UI.Internal.WaveformPlotElement.PlotYAppend(Double[] yData, Int32 startIndex, Int32 length, Double increment)
at NationalInstruments.UI.Internal.WaveformPlotElement.PlotYAppend(Double[] yData)
at NationalInstruments.Restricted.WaveformGraphManager.PlotYAppendMultiple(Double[,] yData, DataOrientation orientation)
at NationalInstruments.UI.WindowsForms.WaveformGraph.PlotYAppendMultiple(Double[,] yData)
at DEER_DAQ.modFunctions.DisplayData()

 

This is my call:

 

frmD.WaveformGraph(cnt).PlotYAppendMultiple(ChartData)

 

This is how ChartData is declared:

 

Public ChartData(10, 0) As Double

 

This is a multi-threaded application, so it may be possible that I am entering into this function before the last iteration was completed.  I have set up a flag so that if I have not completed this function, future calls will bounce out now.  The function is not critical as it is just a display to the screen.  Any other ideas on why I would get a barrage of these errors at one moment in time?

Programming Data Acquisition and Control in Measurement Studio and Labwindows/CVI
0 Kudos
Message 1 of 2
(141 Views)

Hello,

 

This error happens because PlotYAppendMultiple is being called concurrently, causing the graph’s internal axis scaling to try adding duplicate ticks. To fix it, ensure only one thread updates the graph at a time by using a lock or SyncLock around the plotting call. Also, validate your data and consider setting fixed axis ranges to avoid auto-scaling issues.

0 Kudos
Message 2 of 2
(24 Views)