如何避免;收集被修改;枚举操作不能执行;在刷新C#图表时?

如何避免;收集被修改;枚举操作不能执行;在刷新C#图表时?,c#,C#,我在尝试使用一段时间并不断刷新图表时遇到了这个问题。 首先,我使用函数:AddY()和函数:removeAt()来更新最新的数据,例如示例1 我还尝试使用数组来保存数据,并将数据左移,然后添加最新的数据。刷新数组后,我使用函数:DataBindY()绘制图表。请参考示例2 在构建过程中没有错误,并且函数一开始是正常的,请随机等待一段时间,图表将变成一个红十字,并跳出错误消息,其中显示“集合已修改;枚举操作可能无法执行” 构建成功有两件奇怪的事情,这意味着代码是正确的,对吗?第二个是“随机时间”,

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

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

在构建过程中没有错误,并且函数一开始是正常的,请随机等待一段时间,图表将变成一个红十字,并跳出错误消息,其中显示“集合已修改;枚举操作可能无法执行”

构建成功有两件奇怪的事情,这意味着代码是正确的,对吗?第二个是“随机时间”,每次我尝试生存的时间是不同的。这真的没有道理。我已经在网上搜索了这条错误消息,但是我找不到熟悉的情况

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

Thx

顺便说一句,我的窗口系统是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++;
}
double[]温度={};
bool fg\u remove\u chart\u point=false;
uint计数器=0;
while(true)
{
睡眠(1000);
如果(计数器>100)
fg_移除_图表_点=真;
如果(前景图删除图表点)
{
图表1.图表区域[0]。AxisX.Minimum=0;
图表1.图表区域[0]。AxisX.Maximum=100+2;
//更新数组
对于(int x=0;x<(100-1);x++)
温度[x]=温度[x+1];
温度[100-1]=换算为双倍(50);
}
其他的
{
调整数组大小(参考温度,转换为16(计数器));
温度[计数器-1]=转换为双倍(50);
}
图表_1.系列[0]。点。清除();
chart_1.系列[0].点.DataBindY(温度);//使用数组绘制图表
图1.Update();
计数器++;
}

看起来像是线程安全问题。是否从不同的线程修改和查看此集合?这与您的“构建成功,这意味着代码正确,对吗?”-错误。仅仅因为它可以编译并不意味着代码就可以工作。“每次我尝试时,存活时间都不一样”-这表明问题与线程有关。第一步是找出哪个集合有问题。使用堆栈跟踪找出它来自哪一行,并告诉我们。大家好,我一直在谷歌搜索并找到解决这个问题的方法。它表示如果您想更改UI,最安全的方法是使用Invoke()或BeginInvoke()。在我使用两个调用函数来处理添加和删除点之后,红十字会再也没有出现过。