类型为#System; OverflowException'的第一次机会异常发生在mscorlib.dll

时间:2016-05-02 07:09:15

标签: c#

我正在开发C#windows表单应用程序,我正在使用图表控件。我需要使用带有InvokeRequired和BeginInvoke的交叉线程每1秒向图表添加数据点。我在“输出”窗口中收到以下消息:

  

类型' System.OverflowException'的第一次机会异常。发生在mscorlib.dll中。

     

类型' System.Reflection.Targetinvocationexception'的第一次机会异常。发生在mscorlib.dll

我不知道它到底在哪里,但它完全崩溃了我的应用程序。请指导我。

 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);           

        }
    }

2 个答案:

答案 0 :(得分:0)

似乎&#34;第一次机会异常&#34;在VS中频繁(足够),你是否仍在调试模式下连续运行24小时?如果程序是发布编译而未被调试,那么您可能不会得到此异常

答案 1 :(得分:0)

<强>更新

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

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

试试这个: 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(); 
}