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 异常的主要内容,如果未能解决你的问题,请参考以下文章

c# 操作Excel 图表并设置图表的格式?

在 C# 中正确使用 WPF 绘制图表

C#:在winform上使用定时器来改变图表,定时器需要单独的方法,图表数据不能从单独的方法中编辑

C#中VS2010中数据库图表的动态绑定

图表 COUNT 查询 C#?

使用带有 xceed 命名空间的 c# 在 ms word 中的特定位置插入图表