'System.OverflowException'型的第一次机会例外发生在mscorlib中.dll



我正在开发C#窗体应用程序,我正在使用图表控件。我需要使用InvokeRequired和BeginInvoke的跨线程每隔1秒将数据点添加到图表中

mscorlib.dll中首次出现"System.OverflowException"类型的异常。

mscorlib.dll 中首次出现"System.Reflection.Targetinvocationexception"类型的异常

我不知道它到底是从哪里来的,但它正在彻底破坏我的应用程序。请引导我。

 public void AddNewPoint(DateTime timeStamp, System.Windows.Forms.DataVisualization.Charting.Series ptSeries1, System.Windows.Forms.DataVisualization.Charting.Series ptSeries2, double Y1value, double Y2value)
    {
        if (this.chart1.InvokeRequired)
        {
            BeginInvoke((Action)(() =>
            {                  
                this.chart1.Series[0].Points.AddXY(timeStamp.ToOADate(), Y1value);
                this.chart1.Series[1].Points.AddXY(timeStamp.ToOADate(), Y2value);
                if( ((count % 60) == 0)&&(count!=0))
                {                
                    mviewcount += 60;
                    viewcount += 60;                    
                    chart1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
                    //chart1.ChartAreas[0].AxisX.ScaleView.Size = 20;
                    chart1.ChartAreas[0].AxisX.Minimum = DateTime.FromOADate(ptSeries1.Points[count - 1].XValue).ToOADate(); 
                    chart1.ChartAreas[0].AxisX.Maximum = DateTime.FromOADate(ptSeries1.Points[count - 1].XValue).AddMinutes(1).ToOADate();                        
                    min = chart1.ChartAreas[0].AxisX.Minimum;
                    max = chart1.ChartAreas[0].AxisX.Maximum;
                }
                if (count >= 60)
                {
                    if ((count >= viewcount) && (count <= mviewcount))
                    {                            
                        chart1.Series[0].Points[0].AxisLabel = System.DateTime.FromOADate(chart1.Series[0].Points[count - 1].XValue).ToString();
                        chart1.ChartAreas[0].AxisX.ScaleView.Position = max;
                        //chart1.ChartAreas[0].AxisX.ScaleView.Position = chart1.Series[0].Points.Count - chart1.ChartAreas[0].AxisX.ScaleView.Size;
                    }
                }
                chart1.Update();
                chart1.ChartAreas[0].RecalculateAxesScale();
            }));
        }
    }
    public void AddData() //calling using thread
    {
        while (true)
        {
            if (flag) // making flag true using timer for every 1sec
            {
                flag = false;
                DateTime timeStamp = DateTime.Now;
                double Y1 = 0.0;
                double Y2 = 0.0;
                Y1 = getY1(count);
                Y2 = getY2(count + 1);
               
                AddNewPoint(timeStamp, chart1.Series[0], chart1.Series[1], Y1, Y2);
                
                count++;
            }
           Thread.Sleep(1);           
         
        }
    }




 

更新

嗯,你可能需要一个更好的设计方法。1.在2-3周的时间里,收集自己数据结构中的信息/数据点。在你的情况下,两个列表就可以了。2.根据用户请求,让图表只呈现选定的数据部分。这叫做分页。例如,图表将显示前1000个数据点,单击"下一步"按钮将显示下一个1000数据点。您还可以提供文本框来提供范围。3.这减少了图表上的负载4.分离UI渲染和数据采集逻辑

还要确保AddData()没有在UI线程上运行。主线程上的不确定while循环最终可能导致溢出异常。

试试这个:1.在表单中添加Timer控件2.按照以下方式更改AddData方法:

public void AddData()
{
    timer1.Interval = 1000;
    timer1.Tick += (s, e) => 
    {
        flag = false;
        DateTime timeStamp = DateTime.Now;
        double Y1 = 0.0;
        double Y2 = 0.0;
        Y1 = getY1(count);
        Y2 = getY2(count + 1);
        AddNewPoint(timeStamp, chart1.Series[0], chart1.Series[1], Y1, Y2);
        Thread.Sleep(1);
        count++;
    };
    timer1.Start(); 
}

在VS中,"首次机会异常"似乎很频繁(足够),您是否在调试模式下连续运行了24小时?如果程序是经过版本编译的,并且没有进行调试,则可能不会出现此异常。

最新更新