C# 用 chart 画多个动态曲线图 卡死

 采用C#的chart来画动态曲线图(chart1, chart2, char3, chart4) ,大约每100毫秒收到串口送过来的数据50 个bytes左右
char1的曲线基本上卡死,char2曲线更新缓慢,char3曲线流畅, chart4 曲线能更新正常。 I7 ,32Gb RAM 电脑上测试。

串口送到数据事件后

Invoke(new RecvCOMDataDelegate(UpdateUIData), new object[] { readBytes });

UI 主线程来画4个charts
四个chart的 X轴 用同个long xSeq来叠加,如果用时间戳没足够空间显示,时间戳毕竟太长,
Y轴是来自串口收到的数据。但要求能够动态更新Y轴的最大和最小值。

private void UpdateUIData(byte[] readBytes)
{
xSeq++;
//char1
//char2
//char3

// chart4 for curve W1 , W2
int w1_raw = ...
int w2_raw = ...
// Debug.WriteLine("W1={0}", w1_raw);
// Debug.WriteLine("W2={0}", w2_raw);

        chart4W1W2.Series[0].Points.AddXY(xSeq, w1_raw);
        chart4W1W2.Series[1].Points.AddXY(xSeq, w2_raw);
        //保持100个点
        if (chart4W1W2.Series[0].Points.Count > 100)
        {
            chart4W1W2.Series[0].Points.RemoveAt(0);
        }

        if (chart4W1W2.Series[1].Points.Count > 100)
        {
            chart4W1W2.Series[1].Points.RemoveAt(0);
        }
      //下面是获取W1 曲线Y轴的最大和最小值
        DataPoint w1_maxdp = chart4W1W2.Series[0].Points.FindMaxByValue();
        DataPoint w1_mindp = chart4W1W2.Series[0].Points.FindMinByValue();
        double[] w1s_max = w1_maxdp.YValues;
        double[] w1s_min = w1_mindp.YValues;

          //下面是获取W2 曲线Y轴的最大和最小值
        DataPoint w2_maxdp = chart4W1W2.Series[1].Points.FindMaxByValue();
        DataPoint w2_mindp = chart4W1W2.Series[1].Points.FindMinByValue();
        double[] w2s_max = w2_maxdp.YValues;
        double[] w2s_min = w2_mindp.YValues;
       

       //比较w1 和 w2谁的最小值最小,和谁的最大值最大
        axY_min = ((w1s_min[0] < w2s_min[0] ? w1s_min[0] : w2s_min[0]) - 500);
        axY_max = ((w1s_max[0] > w2s_max[0] ? w1s_max[0] : w2s_max[0]) + 500);

        chart4W1W2.ChartAreas[0].AxisY.Minimum = axY_min;
        chart4W1W2.ChartAreas[0].AxisY.Maximum = axY_max;

        chart4W1W2.ChartAreas[0].AxisX.Minimum = chart4W1W2.Series[0].Points[0].XValue;
        chart4W1W2.ChartAreas[0].AxisX.Maximum = xSeq;

}