我正在开发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);
}
}
答案 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();
}