public void Read() { GearedValues <ObservablePoint> copyValues = new GearedValues <ObservablePoint>(); if (IsReading) { return; } //lets keep in memory only the last 20000 records, //to keep everything running faster IsReading = true; Action readFromTread = () => { while (IsReading) { Thread.Sleep(1000); //when multi threading avoid indexed calls like -> Values[0] //instead enumerate the collection //ChartValues/GearedValues returns a thread safe copy once you enumerate it. //TIPS: use foreach instead of for //LINQ methods also enumerate the collections chartValue.Clear(); chartValue.AddRange(ChartsData.ChartPositionTimeValues); int len = chartValue.Count; if (len > 0) { //copyValues.AddRange(UAClientForm.ChartPositionTimeValues); ChartsData.CartesianChartPositionTimeValues.AddRange(chartValue); for (int i = 0; i < len & ChartsData.ChartPositionTimeValues.Count > 1; i++) { ChartsData.ChartPositionTimeValues.RemoveAt(0); } } chartValue.Clear(); } }; //2 different tasks adding a value every ms //add as many tasks as you want to test this feature Task.Factory.StartNew(readFromTread); //Task.Factory.StartNew(readFromTread); //Task.Factory.StartNew(readFromTread); //Task.Factory.StartNew(readFromTread); //Task.Factory.StartNew(readFromTread); //Task.Factory.StartNew(readFromTread); //Task.Factory.StartNew(readFromTread); //Task.Factory.StartNew(readFromTread); }
// Clears the graph public void WipeGraph() { series1Values.Clear(); series2Values.Clear(); setLine1Values.Clear(); setLine2Values.Clear(); setLine3Values.Clear(); }