我正在开发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小时?如果程序是经过版本编译的,并且没有进行调试,则可能不会出现此异常。