首页 > 解决方案 > 如何避免“集合被修改;枚举操作可能无法执行”。在刷新 C# 图表期间?

问题描述

我在尝试使用一段时间并不断刷新图表时遇到了这个问题。首先,我使用函数:AddY() 和函数:removeAt() 来更新最新数据,例如示例 1。

我也尝试使用数组来保存数据并自己左移数据,并添加最新数据。刷新数组后,我使用函数:DataBindY() 来绘制图表。请参考示例 2。

构建过程中没有报错,功能正常,随机等待一段时间,图表会变成一个红叉,并跳出错误信息“集合已修改;枚举操作可能无法执行”。

构建成功有两个奇怪的事情,这意味着代码是正确的,对吧?其次是“随机时间”,每次尝试的生存时间都不一样。这真的没有意义。我在网上搜索过这个错误信息,但我找不到熟悉的情况。

有没有人遇到过同样的情况可以帮助我解决这个问题?

谢谢。

顺便说一句,我的窗口系统是 Win7,C# 版本是 2010。

示例 1

bool fg_remove_chart_point = false;
uint counter = 0;
while (true)
{
    Thread.sleep(1000);
    if (counter > 100)
        fg_remove_chart_point = true;

    if (fg_remove_chart_point)
    {
        chart_1.ChartAreas[0].AxisX.Minimum = 0;
        chart_1.ChartAreas[0].AxisX.Maximum = 100 + 2;

        chart_1.Series[0].Points.RemoveAt(0); //Delete
        chart_1.Update();
    }
    chart_1.Series[0].Points.AddY(50); //Draw chart
    chart_1.Update();   
    counter++;
}

示例 2

double[] temperature = { };
bool fg_remove_chart_point = false;
uint counter = 0;
while (true)
{
    Thread.sleep(1000);

    if (counter > 100)
        fg_remove_chart_point = true;

    if (fg_remove_chart_point)
    {
        chart_1.ChartAreas[0].AxisX.Minimum = 0;
        chart_1.ChartAreas[0].AxisX.Maximum = 100 + 2;

        //Update the array
        for (int x = 0; x < (100 - 1); x++)
            temperature[x] = temperature[x + 1];

        temperature[100 - 1] = Convert.ToDouble(50);
    }
    else
    {
        Array.Resize<double>(ref temperature, Convert.ToInt16(counter));
        temperature[counter - 1] = Convert.ToDouble(50);
    }

    chart_1.Series[0].Points.Clear();
    chart_1.Series[0].Points.DataBindY(temperature); //Use array to draw chart
    chart_1.Update();

    counter++;
}

标签: c#

解决方案


推荐阅读