C# 中图表的 System.ExecutionEngine 异常
Posted
技术标签:
【中文标题】C# 中图表的 System.ExecutionEngine 异常【英文标题】:System.ExecutionEngine Exception for charts in C# 【发布时间】:2020-07-20 06:10:18 【问题描述】:我正在尝试绘制传感器数据的实时绘图。UI 由图表、开始和停止按钮组成。
当按下开始按钮时,来自传感器的数据会使用 100 毫秒的计时器绘制在图表上。 但它会引发类似系统执行引擎异常的异常。如果我用 while(true) 循环替换更新值的计时器方式,没有例外或其他问题。但在这种情况下,我将失去对 UI 其他部分的控制,因为我只使用 1 个线程。
欢迎提出建议/意见/帮助!
while (true)
chart1.Series[0].Points.Clear();
// Get data from sensor using sensor sdk,
// The function returns 2 arrays, x-array and y-array of values to be plotted
// Display x and z values
chart1.Series[0].Points.DataBindXY(adValueX, adValueZ);
chart1.Update();
System.Threading.Thread.Sleep(100);
【问题讨论】:
您好,请出示您的代码和完整的例外情况。 while (true) chart1.Series[0].Points.Clear(); // 使用传感器 sdk 从传感器获取数据,// 函数返回 2 个数组,x 数组和 y 数组要绘制的值 // 显示 x 和 z 值 chart1.Series[0].Points.DataBindXY(adValueX,广告价值Z); chart1.Update(); System.Threading.Thread.Sleep(100); 您好,感谢您的代码,现在请edit 您的问题包括完整的异常以及在哪一行引发。如果您提及这段代码以哪种方法运行也会有所帮助:它是一个线程吗?事件处理程序?等 上面的代码可以工作,但是当 while 循环开始时,我失去了对表单的控制。没有其他按钮,甚至移动表单都被禁用。只是图表得到了更新。所以我用一个计时器来做同样的事情,当计时器被打勾时(在 100 毫秒),图表中的值将被更新。在这种情况下,我的问题是 System.ExecutionEngineException 并且没有其他关于它的信息,在哪一行或任何类似的细节 @Arjun,有更新吗?如果您的问题已经解决,您可以点击“✔”将相应的回复标记为答案。 【参考方案1】:在您的 UI 线程中使用 while (true)
时,您基本上会阻止所有其他与 UI 相关的功能(因为 UI 线程很忙)。
解决这个问题的常用方法有 3 种:
使用 asyc/await :虽然我不建议在您的场景中使用它。 将Application.DoEvents()
添加到您的循环中,这实际上是一种克服UI 响应能力的技巧。
使用定时器
您已经使用了最后一个选项,但遇到了错误。很可能您的 Timer 没有在 UI 线程上运行,这可能会导致更新 UI 组件时出现问题。
有多种方法可以解决它:这是一种:
protected void OnYourTimerEventHandler()
BeginInvoke(new MethodInvoker(delegate
chart1.Series[0].Points.Clear();
// Get data from sensor using sensor sdk,
// The function returns 2 arrays, x-array and y-array of values to be plotted
// Display x and z values
chart1.Series[0].Points.DataBindXY(adValueX, adValueZ);
chart1.Update();
));
更多文档可以在MSDN找到
【讨论】:
我也试过 Application.DoEvents()。还有其他组件被锁定在表单中。 这就是为什么它被认为是“hacky-isch”【参考方案2】:根据您的描述,您希望使用 100ms 的计时器,并避免在使用上述代码时锁定控件。
我建议你可以用定时器来做。
这里是代码示例,您可以参考。
public partial class Form1 : Form
public Form1()
InitializeComponent();
Dictionary<double, double> dic = new Dictionary<double, double>();
private void Form1_Load(object sender, EventArgs e)
chart1.Series.Clear();
var series1 = new System.Windows.Forms.DataVisualization.Charting.Series
Name = "Series1",
Color = System.Drawing.Color.Green,
IsVisibleInLegend = false,
IsXValueIndexed = true,
ChartType = SeriesChartType.Line
;
this.chart1.Series.Add(series1);
series1.Points.AddXY(1, 10);
series1.Points.AddXY(2, 14);
chart1.Invalidate();
timer1.Interval = 100;
dic.Add(1, 20);
dic.Add(2, 30);
dic.Add(3, 40);
dic.Add(4, 60);
dic.Add(5, 70);
private void timer1_Tick(object sender, EventArgs e)
chart1.Series[0].Points.Clear();
// Get data from sensor using sensor sdk,
// The function returns 2 arrays, x-array and y-array of values to be plotted
// Display x and z values
chart1.Series[0].Points.DataBindXY(dic.Keys, dic.Values);
chart1.Update();
private void button1_Click(object sender, EventArgs e)
timer1.Start();
结果:
【讨论】:
以上是关于C# 中图表的 System.ExecutionEngine 异常的主要内容,如果未能解决你的问题,请参考以下文章